Для опытов с графикой, предлагаю попытаться вспомнить о старой, и многими уже давно забытой игре на 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.
|
Целью написания полноценной игры я не задавался, так что оставлю врагов, стрельбу и препятствия на вашей совести: ;)

|
К содержанию
|
|
![]() |
Скачать новую версию данного учебника в одном архиве
Курс находится в процессе разработки, поэтому архив постоянно обновляется! |