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: Align – alRight, свойство Shape изменим на stCircle, а свойство Visible – false.
Теперь можно приступать к непосредственно написанию этих процедур:
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, написать правила игры.
Вот и всё…. Теперь компилируем проект и играем:)
На этом урок объявляется законченным и остается добавить только, что эту идею можно развить и создать меню, различные уровни сложности, карты, миссии и т.д.
И как обычно для ленивых или тех, у кого что-то не получилось исходник можно скачать здесь.
А не ленивые, лучше сходите и приготовьте капучино. :)
А не ленивые, лучше сходите и приготовьте капучино. :)
Не работает . Выбивает ошибку [Error] Unit1.pas(18): ',' or ':' expected but '(' found
ОтветитьУдалить