Танк (вывод спрайтов)

Для опытов с графикой, предлагаю попытаться вспомнить о старой, и многими уже давно забытой игре на Dendy - "Battle City". Для начала нам понадобится 4 изображения одного и того же танка повёрнутого на углы n*900. Эти изображения должны быть в виде png файлов размером 24х24 пикселей, с именами вида tankN.png (где N - порядковый номер изображения, начиная с 0).


tank0.png

tank1.png

tank2.png

tank3.png
Взять все картинки в одном архиве ("Правая кнопка" -> "Сохранить как").

Нарисовав это чудо техники, создадим новый проект, и первым же делом добавим эти файлы в ресурс при помощи "Project - Import resource file:". Наш танк должен уметь ездить по нажатию на соответствующие клавиши и ни в коем случае не выезжать за пределы поля! Приступим к написанию кода:

program Tank;

 const
   SPEED = 1; // Скорость движения танка

 var
   i    : Integer;
 // Внешний вид танка при различных углах поворота
   tank : array [0..3] of image;
   dir  : Integer; // направление
   X, Y : Integer; // позиция
   key  : Integer;

 begin
 // Инициализация
   for i := 0 to 3 do // Подгружаем все картинки из ресурса
     tank[i] := LoadImage('/tank' + chr(48 + i) + '.png'); // 48 - код нуля
   dir := 0;  // смотрим строго направо
   X   := 48; // позиция танка по X
   Y   := 48; // и по Y соответственно :)
  
 // Подготовка поля вывода
   SetColor(0, 0, 0);
   FillRect(0, 0, GetWidth, GetHeight);
  
 // Отрисовка и обработка ввода
   repeat
   // Стираем танк
     FillRect(X, Y, 24,24);
   // Получаем код зажатой клавиши
     key := GetKeyPressed;
   // Вот что бывает, когда нет возможности использовать case ;)
     if key = KE_KEY6 then
     begin
       dir := 0;
       X   := X + SPEED;
     end else 
       if key = KE_KEY8 then
       begin
         dir := 3;
         Y   := Y + SPEED;
       end else
         if key = KE_KEY4 then
         begin
           dir := 2;
           X   := X - SPEED;
         end else
           if key = KE_KEY2 then
           begin
             dir := 1;
             Y   := Y - SPEED;
           end;
   // контролируем выход за границы экрана
     if X < 0 then X := 0;
     if Y < 0 then Y := 0;
     if X > GetWidth  - 24 then X := GetWidth  - 24;
     if Y > GetHeight - 24 then Y := GetHeight - 24;
   // Рисуем танк новой позиции
     DrawImage(tank[dir], X, Y);
   // Вывод этого безобразия на экран и задержка на 20 мс  
     repaint;  
     delay(20);
   until GetKeyClicked = KE_KEY0; // Закрыть приложение при нажатии "0"
 end.

Целью написания полноценной игры я не задавался, так что оставлю врагов, стрельбу и препятствия на вашей совести: ;)





 
К содержанию

 
Скачать новую версию данного учебника в одном архиве

Курс находится в процессе разработки, поэтому архив постоянно обновляется!




 
Hosted by uCoz