unit sprites;
interface
uses bmpread;
const
Xsize = 20; {размеры спрайта, точек}
Ysize = 20;
TransparentColor = $FF; {?прозрачный? цвет}
type
SpriteArrayType =
array[0..Ysize-1,0..Xsize-1]of byte;
{массив, равный по размеру спрайту}
SpriteType = record
x,y : word; {текущие координаты спрайта}
dx,dy : integer; {приращения координат спрайта}
Img : ^SpriteArrayType;
{для массива с изображением спрайта}
Back : ^SpriteArrayType;
{для массива, хранящего фон под спрайтом}
end;
ScreenType = array[0..199,0..319]of byte;
{для экрана}
var
Scr : ^ScreenType; {экран}
p : array[0..767]of byte;
procedure GetBuffer(Sprite:SpriteType);
{сохранение фона под спрайтом в буфере}
procedure PutBuffer(Sprite:SpriteType);
{восстановление фона}
procedure PutSprite(Sprite:SpriteType);
{вывод спрайта на экран}
procedure CreateSprite(s:string; x,y,dx,dy:integer;
var Sprite:SpriteType); {?создание? спрайта}
procedure DestroySprite(Sprite:SpriteType);
{?уничтожение? спрайта}
procedure CalcSpritePosition(var Sprite:SpriteType);
{вычисление новых координат спрайта}
procedure PutBackground; {создание фона на экране}
implementation
procedure GetBuffer(Sprite:SpriteType);
{сохранение фона под спрайтом в буфере}
var
i,j : word; {переменные цикла}
begin
for j := 0 to Ysize-1 do
for i := 0 to Xsize-1 do
with Sprite do
Back^[j,i] := Scr^[j+y,i+x];
end;
procedure PutBuffer(Sprite:SpriteType);
{восстановление фона}
var
i,j : word; {переменные цикла}
begin
for j := 0 to Ysize-1 do
for i := 0 to Xsize-1 do
with Sprite do
Scr^[j+y,i+x] := Back^[j,i];
end;
procedure PutSprite(Sprite:SpriteType);
{вывод спрайта на экран}
var
i,j : word; {переменные цикла}
begin
for j := 0 to Ysize-1 do
for i := 0 to Xsize-1 do
with Sprite do
if Img^[j,i] <> TransparentColor then
{ставим только точки,}
{цвет которых отличается от ?прозрачного?}
Scr^[j+y,i+x] := Img^[j,i];
end;
procedure CreateSprite(s:string; x,y,dx,dy:integer;
var Sprite:SpriteType); {?создание? спрайта}
var
f : file; {файл с изображением спрайта}
begin
getmem(Sprite.Img,sizeof(SpriteArrayType));
{выделяем память для спрайта}
getmem(Sprite.Back,sizeof(SpriteArrayType));
{выделяем память для буфера}
Readbmp(@(Sprite.Img^),Xsize,Ysize,@p,s);
Sprite.x := x;
Sprite.y := y; { задаем начальные значения }
Sprite.dx := dx; { координат и приращений }
Sprite.dy := dy;
end;
procedure DestroySprite(Sprite:SpriteType);
{?уничтожение? спрайта}
begin
{ возвращаем память }
freemem(Sprite.Back,sizeof(SpriteArrayType));
freemem(Sprite.Img,sizeof(SpriteArrayType));
end;
procedure CalcSpritePosition(var Sprite:SpriteType);
{вычисление новых координат спрайта}
begin { спрайта и их приращений}
{по достижении границы экрана делаем,}
{ чтобы спрайт ?отразился? от нее}
with Sprite do begin
if (x + Xsize + dx) >= 319 then
dx := -dx; {вычисляем новые приращения}
if (x + dx) <= 0 then
dx := -dx; {реализующие ?отражение?}
if (y + Ysize + dy) >= 199 then
dy := -dy; {спрайта от стенок}
if (y + dy) <= 0 then
dy := -dy;
x := x+dx; { вычисляем новые }
y := y+dy; { координаты спрайта }
end;
end;
procedure PutBackground; {создание фона на экране}
var
i,j : word; {переменные цикла}
begin
for j := 0 to 199 do
for i := 0 to 319 do
Scr^[j,i] := lo(i+j*8);
end;
begin
scr := ptr(SegA000,0); {указатель на экран}
end.
назад