program animate; uses sprites; type PictData = record magic,mode:integer; palette: array [0..15] of integer; pixeldata: array [0..31999] of integer; end; Sprite = record x,y:integer; oldX,oldY:integer; xdelta,ydelta:integer; curFrame:integer; frameCount:integer; frameTime:integer; frameLeft:integer; moveTime:integer; moveLeft:integer; changed:boolean; frame:array [0..3] of SpritePixels; end; var pic:PictData; filename:string; infile:file; ch:char; stickMan:Sprite; rocket:Sprite; rocket2:Sprite; rocket3:Sprite; procedure WaitVSync; external; procedure loadPalette(var pic:PictData); var i:integer; begin for i := 0 to 15 do setpalette(i, pic.palette[i]); end; procedure showPic(var pic:PictData); begin PutScreen(pic.pixeldata); end; procedure loadSpriteFrame(var aSprite:Sprite;spriteIndex:integer; var sheetFile:file;sheetIndex:integer); begin seek(sheetFile, 8 + sheetIndex * 512); read(sheetFile, aSprite.frame[spriteIndex]); if aSprite.frameCount <= spriteIndex then aSprite.frameCount := spriteIndex + 1; aSprite.curFrame := 0; writeln('loaded sprite frame ', spriteIndex, ' from ', sheetIndex); end; procedure animateSprite(var aSprite:Sprite); var frameIndex:integer; frameTime,frameLeft:integer; moveTime,moveLeft:integer; ydelta:integer; oldX,oldY:integer; begin ydelta := aSprite.ydelta; frameIndex := aSprite.curFrame; frameTime := aSprite.frameTime; frameLeft := aSprite.frameLeft; moveTime := aSprite.moveTime; moveLeft := aSprite.moveLeft; oldX := aSprite.x; oldY := aSprite.y; aSprite.oldX := oldX; aSprite.oldY := oldY; frameLeft := frameLeft - 1; if frameLeft <= 0 then begin frameIndex := frameIndex + 1; frameLeft := aSprite.frameTime; aSprite.frameLeft := frameLeft; aSprite.curFrame := frameIndex; if frameIndex >= aSprite.frameCount then aSprite.curFrame := 0; end; moveLeft := moveLeft -1; if moveLeft <= 0 then begin aSprite.x := aSprite.x + aSprite.xdelta; aSprite.y := aSprite.y + aSprite.ydelta; moveLeft := moveTime; if aSprite.x > 608 then aSprite.x := 0; if aSprite.y < 0 then begin aSprite.y := 200; aSprite.x := 0; end; end; aSprite.frameLeft := frameLeft; aSprite.moveLeft := moveLeft; end; procedure animLoop; var i:integer; oldX,oldY:integer; roldX,roldY:integer; r2oldX,r2oldY:integer; r3oldX,r3oldY:integer; begin stickMan.x := 0; stickMan.y := 322; stickMan.frameTime := 6; stickMan.frameLeft := stickMan.frameTime; stickMan.curFrame := 0; stickMan.xdelta := 2; stickMan.ydelta := 0; stickMan.moveTime := 2; stickman.moveLeft := stickMan.moveTime; rocket.x := 0; rocket.y := 200; rocket.frameTime := 5; rocket.frameLeft := rocket.frameTime; rocket.curFrame := 0; rocket.xdelta := 3; rocket.ydelta := -1; rocket.moveTime := 1; rocket.moveLeft := rocket.moveTime; rocket2.x := 50; rocket2.y := 100; rocket2.frameTime := 5; rocket2.frameLeft := rocket2.frameTime; rocket2.curFrame := 0; rocket2.xdelta := 3; rocket2.ydelta := -1; rocket2.moveTime := 1; rocket2.moveLeft := rocket2.moveTime; rocket3.x :=100; rocket3.y := 50; rocket3.frameTime := 5; rocket3.frameLeft := rocket3.frameTime; rocket3.curFrame := 0; rocket3.xdelta := 3; rocket3.ydelta := -1; rocket3.moveTime := 1; rocket3.moveLeft := rocket3.moveTime; while not ConAvail do begin oldX := stickMan.x; oldY := stickMan.y; roldX := rocket.x; roldY := rocket.y; r2oldX := rocket2.x; r2oldY := rocket2.y; r3oldX := rocket3.x; r3oldY := rocket3.y; PutSprite(roldX, roldY, rocket.frame[rocket.curFrame]); PutSprite(r2oldX, r2oldY, rocket2.frame[rocket2.curFrame]); PutSprite(r3oldX, r3oldY, rocket3.frame[rocket3.curFrame]); PutSprite(oldX, oldY, stickMan.frame[stickMan.curFrame]); animateSprite(rocket); animateSprite(rocket2); animateSprite(rocket3); animateSprite(stickMan); Delay(10); WaitVSync; UndrawSprite(oldX, oldY, pic.pixeldata); UndrawSprite(roldX, roldY, pic.pixeldata); UndrawSprite(r2oldX, r2oldY, pic.pixeldata); UndrawSprite(r3oldX, r3oldY, pic.pixeldata); end; end; begin filename := 'background.pict'; open(infile, filename, ModeReadonly); read(infile, pic); close(infile); writeln('magic: ', pic.magic, ' mode:', pic.mode); loadPalette(pic); showPic(pic); open(infile, 'walking.sprt', ModeReadOnly); loadSpriteFrame(stickMan, 0, infile, 0); loadSpriteFrame(stickMan, 1, infile, 1); loadSpriteFrame(stickMan, 2, infile, 2); loadSpriteFrame(stickMan, 3, infile, 3); close(infile); open(infile, 'rocket.sprt', ModeReadOnly); loadSpriteFrame(rocket, 0, infile, 0); loadSpriteFrame(rocket, 1, infile, 1); loadSpriteFrame(rocket, 2, infile, 2); loadSpriteFrame(rocket, 3, infile, 3); close(infile); rocket2.frame := rocket.frame; rocket3.frame := rocket.frame; animLoop; end.