Delphi: Создаем простейшую 2D игру


Итак, как я и обещал, сегодня мы создадим простейшую 2Д игру «Тир». Цель в этой игре – щелкать по мишени, которая постоянно меняет свое положение.
Идея заключается в том, что при каждом срабатывании таймера стирается старая и рисуется новая мишень на случайном месте. При этом фиксируются все щелчки мышью и  обрабатываются: попал или не попал. Такая вот нехитрая идея.




Для этого открываем Delphi, создаем приложение и кидаем на форму компоненты Button,  Label с панели Standart, компонент Shape с закладки Additional, а также Timerc панели Win32. С самого начала создадим 2 процедуры: одна для рисования мишени, другая для стирания.
Объявляем их после ключевого слова public:

procedurePaintFace(x,y: integer);
procedureEraseFace(x,y: integer);

А после ключевого слова var объявляем переменные:
fx,fy: integer;  // координаты мишен 
n: integer;  // количесво выстрелов   
p: integer;   // количество попаданий  
run :boolean; // запущено или нет?

Изменим параметры Shape: AlignalRight, свойство Shape изменим на stCircle, а свойство Visiblefalse.
Теперь можно приступать к непосредственно написанию этих процедур:

procedure TForm1.PaintFace(x,y: integer);     // рисуем рожицу с помощью Canvas
begin 
Canvas.Pen.Color := clBlack;    
Canvas.Brush.Color := clYellow; 
Canvas.Ellipse(x,y,x+30,Y+30);      
Canvas.Ellipse(x+9,y+10,x+11,y+13);
Canvas.Ellipse(x+19,y+10,x+21,y+13);
Canvas.Arc(x+4,y+4,x+26,y+26,x,y+20,x+30,y+20);
end;
procedure TForm1.EraseFace(x,y: integer); //Стираем рожицу(заливка фоновым цветом)
begin
Canvas.Pen.Color := clBtnFace;  
Canvas.Brush.Color := clBtnFace;
Canvas.Ellipse(x,y,x+30,y+30);
end;

Теперь можно создавать событие на таймере. Дважды кликаем по нему на форме и пишем следующее:
EraseFace(fx,fy); // Стереть
fx:= Random(ClientWidth-30); // Новая случайная координата
fy:= Random(ClientHeight-30); // Новая случайная координата
PaintFace(fx,fy); // Рисовать по новым координатам

Сейчас самое время задать начальные параметры. Для этого дважды щелкаем по форме и создаем событие OnCreate, где прописываем:
fx:=100; // Начальное положение
fy:=100; // Начальное положение
Randomize; // Включаем генератор случайных чисел 
run:=false; // Игра ещё не началась
Чтобы отследить нажание кнопки мыши создадим событие OnMouseDown (во вкладке Events) и пишем следующее:

if run then // Если игра началась
begin
inc(n);  // Увеличиваем на 1 попадания 
PlaySound('1.wav', 0, SND_ASYNC); // Выстрелили
if (x >fx) and (x < fx+30) and // Если попали
     (y >fy) and (y < fy+30)
then begin
inc(p); // Увеличим количество попаданий
       Shape1.Brush.Color:=clGreen; // Зеленый цвет
end
else Shape1.Brush.Color:=clRed; // Не попали - красный цвет
ifn = 10 then // Если 10 выстрелов сделано
begin
Timer.Enabled := False; // Стоп
ShowMessage(Выстрелов: 10. Попаданий: ' +
IntToStr(p)+'.'); // Вывести результат
EraseFace(fx,fy); // Стереть мишень
Label1.Visible := True; // Показать правила
Button1.Visible := True; // Показать кнопку 
        Shape1.Visible:=false; // Скрыть круг
run:=false; // Игра закончилась
p:=0; // Обнулить попадания
end;
end;
И наконец последняя процедура – щелчок по кнопке «Новая игра»:
Label1.Visible := False; // Скрыть правила
Button1.Visible := False; // и кнопку
    Shape1.Visible:=true; // показать круг
Timer1.Enabled := True; // Поехали!!
run :=true; // Игра началась
    n:=0; // 0 выстрелов

Label можно растянуть на всю форму и, воспользовавшись параметром Caption, написать правила игры.
Вот и всё…. Теперь компилируем проект и играем:)
На  этом урок объявляется законченным и остается добавить только, что эту идею можно развить и создать меню, различные уровни сложности, карты, миссии и т.д.

И как обычно для ленивых или тех, у кого что-то не получилось исходник можно скачать здесь.
А не ленивые, лучше сходите и приготовьте капучино. :)

Комментарии

  1. Не работает . Выбивает ошибку [Error] Unit1.pas(18): ',' or ':' expected but '(' found

    ОтветитьУдалить

Отправить комментарий

Популярные сообщения из этого блога