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; changed:boolean; frame:array [0..3] of SpritePixels; end; var pic:PictData; filename:string; infile:file; ch:char; stickMan:Sprite; rocket: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; ydelta:integer; oldX,oldY:integer; begin ydelta := aSprite.ydelta; frameIndex := aSprite.curFrame; frameTime := aSprite.frameTime; frameLeft := aSprite.frameLeft; 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; aSprite.frameLeft := frameLeft; aSprite.x := aSprite.x + aSprite.xdelta; aSprite.y := aSprite.y + aSprite.ydelta; 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; end; procedure animLoop; var i:integer; oldX,oldY:integer; roldX,roldY:integer; begin stickMan.x := 0; stickMan.y := 310; stickMan.frameTime := 6; stickMan.frameLeft := stickMan.frameTime; stickMan.curFrame := 0; stickMan.xdelta := 2; stickMan.ydelta := 0; rocket.x := 0; rocket.y := 200; rocket.frameTime := 1; rocket.frameLeft := rocket.frameTime; rocket.curFrame := 0; rocket.xdelta := 2; rocket.ydelta := -1; while not ConAvail do begin oldX := stickMan.x; oldY := stickMan.y; roldX := rocket.x; roldY := rocket.y; PutSprite(roldX, roldY, rocket.frame[rocket.curFrame]); PutSprite(oldX, oldY, stickMan.frame[stickMan.curFrame]); animateSprite(rocket); animateSprite(stickMan); {Delay(1);} WaitVSync; UndrawSprite(oldX, oldY, pic.pixeldata); UndrawSprite(roldX, roldY, 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); animLoop; end.