program animate; uses sprites,pcmaudio; type PictData = record magic,mode:integer; palette: array [0..15] of integer; pixeldata: array [0..31999] of integer; end; Sprite = record x,y: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; infile:file; ch:char; stickMan:Sprite; rocket:Sprite; rocket2:Sprite; rocket3:Sprite; buf:SndBufPtr; procedure WaitVSync; external; function readAudioFile(fname:string):SndBufPtr; var size:integer; buf:SndBufPtr; f:file; begin open(f, fname, ModeReadOnly); size := FileSize(f); new(buf, size); ReadSample(f, buf); writeln; close(f); readAudioFile := buf; end; procedure changePalette(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 loadPic(filename:string;var pic:PictData); var infile:file; begin open(infile, filename, ModeReadonly); read(infile, pic); close(infile); writeln('magic: ', pic.magic, ' mode:', pic.mode); 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; begin ydelta := aSprite.ydelta; frameIndex := aSprite.curFrame; frameTime := aSprite.frameTime; frameLeft := aSprite.frameLeft; moveTime := aSprite.moveTime; moveLeft := aSprite.moveLeft; frameLeft := frameLeft - 1; if frameLeft <= 0 then begin frameIndex := frameIndex + 1; frameLeft := frameTime; 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.ydelta <> 0 then begin if aSprite.y < 3 then aSprite.ydelta := -aSprite.ydelta else if aSprite.y > 130 then aSprite.ydelta := -aSprite.yDelta; end; end; aSprite.frameLeft := frameLeft; aSprite.moveLeft := moveLeft; end; procedure animLoop; var i:integer; lastX,lastY:integer; rlastX,rlastY:integer; r2lastX,r2lastY:integer; r3lastX,r3lastY:integer; begin stickMan.x := 0; stickMan.y := 205; 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 := 50; 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 := 190; rocket2.frameTime := 5; rocket2.frameLeft := rocket2.frameTime; rocket2.curFrame := 1; rocket2.xdelta := 3; rocket2.ydelta := 0; rocket2.moveTime := 1; rocket2.moveLeft := rocket2.moveTime; rocket3.x :=100; rocket3.y := 90; rocket3.frameTime := 5; rocket3.frameLeft := rocket3.frameTime; rocket3.curFrame := 2; rocket3.xdelta := 3; rocket3.ydelta := -1; rocket3.moveTime := 1; rocket3.moveLeft := rocket3.moveTime; while not ConAvail do begin lastX := stickMan.x; lastY := stickMan.y; rlastX := rocket.x; rlastY := rocket.y; r2lastX := rocket2.x; r2lastY := rocket2.y; r3lastX := rocket3.x; r3lastY := rocket3.y; PutSprite(rlastX, rlastY, rocket.frame[rocket.curFrame]); PutSprite(r2lastX, r2lastY, rocket2.frame[rocket2.curFrame]); PutSprite(r3lastX, r3lastY, rocket3.frame[rocket3.curFrame]); PutSprite(lastX, lastY, stickMan.frame[stickMan.curFrame]); animateSprite(rocket); animateSprite(rocket2); animateSprite(rocket3); animateSprite(stickMan); Delay(10); WaitVSync; UndrawSprite(lastX, lastY, pic.pixeldata); UndrawSprite(rlastX, rlastY, pic.pixeldata); UndrawSprite(r2lastX, r2lastY, pic.pixeldata); UndrawSprite(r3lastX, r3lastY, pic.pixeldata); end; end; begin loadPic('background.pict', pic); 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 := rocket; rocket3 := rocket; buf := readAudioFile('footsteps.tdrau'); SampleQStart(buf, true, 16000); animLoop; SampleQStop; dispose(buf); end.