Tridora-CPU/examples/animate.pas

211 lines
4.9 KiB
ObjectPascal

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;
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;
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.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 := rocket; rocket2.curFrame := 1;
rocket3 := rocket; rocket3.curFrame := 2;
animLoop;
end.