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; 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; end; aSprite.frameLeft := frameLeft; end; procedure animLoop; var i:integer; oldX,oldY:integer; begin stickMan.x := 0; stickMan.y := 310; stickMan.frameTime := 6; stickMan.frameLeft := stickMan.frameTime; stickMan.curFrame := 0; stickMan.xdelta := 2; stickMan.ydelta := 0; oldX := stickMan.x; oldY := stickMan.y; while not ConAvail do begin oldX := stickMan.x; oldY := stickMan.y; PutSprite(oldX, oldY, stickMan.frame[stickMan.curFrame]); animateSprite(stickMan); Delay(10); WaitVSync; UndrawSprite(oldX, oldY, pic.pixeldata); end; end; begin filename := 'grey.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); animLoop; end.