examples: new sprite animation demo
This commit is contained in:
parent
bde01e402c
commit
e08d610aef
6 changed files with 186 additions and 24 deletions
136
examples/animate.pas
Normal file
136
examples/animate.pas
Normal file
|
|
@ -0,0 +1,136 @@
|
|||
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.
|
||||
Loading…
Add table
Add a link
Reference in a new issue