program Sprite;

uses dos,     {для работы с прерыванием VideoBIOS}
     crt,     {для работы с клавиатурой}
     pal,     {для работы с палитрой}
     text256, {для вывода текста}
     timer18, {для измерения времени и синхронизации}
     sprites; {для работы со спрайтами}
const
   TextColor : byte = 0;         {текущий цвет текста}
   NumSprites = 2;               {количество спрайтов}
   NameSprt : array[1..2{NumSprites}]of string =
          (?sprt01.bmp?,?sprt02.bmp?);
                               {имена файлов спрайтов}
var
   Sprt : array[1..NumSprites]of SpriteType; {спрайты}
   r    : registers;      {для вызова прерывания BIOS}
   i    : integer;                  {счетчик спрайтов}
   s    : string;      {для вывода сообщений на экран}
   FPS  : single;       {темп вывода кадров в секунду}

function sign(a:single):integer;
begin
   if a = 0 then
      sign := 0
   else
      if a > 0 then
         sign := 1
      else
         sign := -1;
end;

begin
   GetPal(p[0],0,256);
   FadeOut(p);
   randomize;
   for i := 1 to NumSprites do
      CreateSprite(NameSprt[(i mod 2)+1],random(320
                -Xsize),random(200-Ysize),1,1,Sprt[i]);
   r.ax := $13;  { устанавливаем режим }
   intr($10,r);  {  320х200х256 цветов }
   BlackPal;
   PutBackGround;      {рисуем фон}
   FadeIn(p);
   for i := 1 to NumSprites do begin
      GetBuffer(Sprt[i]);{сохраняем фон под спрайтом}
      PutSprite(Sprt[i]);{и рисуем на его месте спрайт}
   end;
   repeat   {теперь спрайт будет двигаться по экрану}
           {до тех пор, пока мы не нажмем на клавишу}
      for i := NumSprites downto 1 do
         PutBuffer(Sprt[i]);    {восстанавливаем фон}
      for i := 1 to NumSprites do begin
         CalcSpritePosition(Sprt[i]);
         GetBuffer(Sprt[i]);  {сохраняем фон}
         PutSprite(Sprt[i]);  {выводим спрайт}
      end;
      inc(TextColor);
      SetTextParm(TextColor div 16,
                            (TextColor + 48) div 16,1);
      PutText(56,16,?Демонстрационная?);
      SetTextParm(TextColor and $F,0,0);
      PutText(192,16,?программа?);
      SetTextParm(15,0,1);
      FPS := GetFPS;
      str(FPS:0:1,s);
      PutText(120,184,? ?+s+? fps ?);
      if FPS > 1 then      {изменяем приращение}
        for i := 1 to NumSprites do begin
          Sprt[i].dx := sign(Sprt[i].dx)*round(70/FPS);
          Sprt[i].dy := sign(Sprt[i].dy)*round(70/FPS);
        end;
      WaitVerticalRetrace;
        {ожидаем обратный ход луча кадровой развертки}
   until keypressed;
   readkey;                  {чистим буфер клавиатуры}
   FadeOut(p);
   r.ax := $3;
   intr($10,r);       {возвращаемся в текстовый режим}
   for i := NumSprites downto 1 do
      DestroySprite(Sprt[i]);
end.

назад

506