220 lines
5.4 KiB
ObjectPascal
220 lines
5.4 KiB
ObjectPascal
program XmasAnimation;
|
|
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;
|
|
santaSprite: Sprite;
|
|
deerSprite: Sprite;
|
|
ohDeerSprite: Sprite;
|
|
rudolfSprite: Sprite;
|
|
smokeSprite: 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 * 128);
|
|
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;
|
|
|
|
if frameIndex = 1 then
|
|
begin
|
|
ydelta := - ydelta;
|
|
aSprite.ydelta := ydelta;
|
|
end;
|
|
aSprite.y := aSprite.y + ydelta;
|
|
end;
|
|
|
|
aSprite.frameLeft := frameLeft;
|
|
|
|
aSprite.x := aSprite.x + aSprite.xdelta;
|
|
if aSprite.x > 620 then aSprite.x := 0;
|
|
end;
|
|
|
|
procedure animate;
|
|
var i:integer;
|
|
ydelta:integer;
|
|
frameIndex:integer;
|
|
frameTime:integer;
|
|
oldX,oldY:integer;
|
|
begin
|
|
santaSprite.x := 0;
|
|
santaSprite.y := 60;
|
|
santaSprite.frameTime := 10;
|
|
santaSprite.xdelta := 2;
|
|
santaSprite.ydelta := 1;
|
|
|
|
smokeSprite.x := 434;
|
|
smokeSprite.y := 252;
|
|
smokeSprite.frameTime := 20;
|
|
|
|
deerSprite.x := 18;
|
|
deerSprite.y := 60;
|
|
deerSprite.frameTime := 10;
|
|
deerSprite.xdelta := 2;
|
|
deerSprite.ydelta := 1;
|
|
|
|
ohDeerSprite.x := 33;
|
|
ohDeerSprite.y := 61;
|
|
ohDeerSprite.frameTime := 10;
|
|
ohDeerSprite.xdelta := 2;
|
|
ohDeerSprite.ydelta := 1;
|
|
|
|
rudolfSprite.x := 49;
|
|
rudolfSprite.y := 60;
|
|
rudolfSprite.frameTime := 10;
|
|
rudolfSprite.xdelta := 2;
|
|
rudolfSprite.ydelta := 1;
|
|
|
|
ydelta := 1;
|
|
|
|
frameTime := santaSprite.frameTime;
|
|
|
|
while not ConAvail do
|
|
begin
|
|
frameIndex := santaSprite.curFrame;
|
|
oldX := santaSprite.x; oldY := santaSprite.y;
|
|
PutSprite(oldX, oldY, santaSprite.frame[frameIndex]);
|
|
i := i + 1;
|
|
frameTime := frameTime - 1;
|
|
if frameTime = 0 then
|
|
begin
|
|
frameTime := santaSprite.frameTime;
|
|
santaSprite.curFrame := frameIndex + 1;
|
|
if frameIndex >= santaSprite.frameCount
|
|
then
|
|
santaSprite.curFrame := 0;
|
|
|
|
if frameIndex = 0 then ydelta := - ydelta;
|
|
santaSprite.y := santaSprite.y + ydelta;
|
|
end;
|
|
santaSprite.x := santaSprite.x + 2;
|
|
if santaSprite.x > 620 then santaSprite.x := 0;
|
|
|
|
PutSprite(deerSprite.x, deerSprite.y,
|
|
deerSprite.frame[deerSprite.curFrame]);
|
|
|
|
PutSprite(ohDeerSprite.x, ohDeerSprite.y,
|
|
ohDeerSprite.frame[ohDeerSprite.curFrame]);
|
|
|
|
PutSprite(rudolfSprite.x, rudolfSprite.y,
|
|
rudolfSprite.frame[rudolfSprite.curFrame]);
|
|
|
|
PutSprite(smokeSprite.x, smokeSprite.y,
|
|
smokeSprite.frame[smokeSprite.curFrame]);
|
|
|
|
animateSprite(deerSprite);
|
|
animateSprite(ohDeerSprite);
|
|
animateSprite(rudolfSprite);
|
|
animateSprite(smokeSprite);
|
|
|
|
Delay(10);
|
|
WaitVSync;
|
|
|
|
UndrawSprite(oldX, oldY, pic.pixeldata);
|
|
UndrawSprite(deerSprite.oldX, deerSprite.oldY, pic.pixeldata);
|
|
UndrawSprite(ohDeerSprite.oldX, ohDeerSprite.oldY, pic.pixeldata);
|
|
UndrawSprite(rudolfSprite.oldX, rudolfSprite.oldY, pic.pixeldata);
|
|
UndrawSprite(smokeSprite.oldX, smokeSprite.oldY, 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, 'sprites.sprt', ModeReadOnly);
|
|
loadSpriteFrame(santaSprite, 0, infile, 0);
|
|
loadSpriteFrame(santaSprite, 1, infile, 1);
|
|
|
|
loadSpriteFrame(deerSprite, 0, infile, 5);
|
|
loadSpriteFrame(deerSprite, 1, infile, 6);
|
|
loadSpriteFrame(deerSprite, 2, infile, 7);
|
|
|
|
loadSpriteFrame(ohDeerSprite, 0, infile, 7);
|
|
loadSpriteFrame(ohDeerSprite, 1, infile, 5);
|
|
loadSpriteFrame(ohDeerSprite, 2, infile, 6);
|
|
|
|
loadSpriteFrame(rudolfSprite, 0, infile, 3);
|
|
loadSpriteFrame(rudolfSprite, 1, infile, 4);
|
|
loadSpriteFrame(rudolfSprite, 2, infile, 2);
|
|
|
|
loadSpriteFrame(smokeSprite, 0, infile, 8);
|
|
loadSpriteFrame(smokeSprite, 1, infile, 9);
|
|
loadSpriteFrame(smokeSprite, 2, infile, 10);
|
|
loadSpriteFrame(smokeSprite, 3, infile, 11);
|
|
|
|
close(infile);
|
|
|
|
animate;
|
|
end.
|