Отправляет email-рассылки с помощью сервиса Sendsay

Уроки по Delphi

  Все выпуски  

Уроки по Delphi


Информационный Канал Subscribe.Ru


*Номер 4* (2004-04-17)

Урок 6.


Задание: С сегодняшнего урока начинаем писать игру. На её примере будем разбираться со многими
полезными операторами, свойствами и функциями разных элементов Делфи. Игра будет в стиле "Гаубица".
То есть у нас есть цель и пушка. Изменяя угол наклона пушки и начальную скорость снаряда надо поразить цель.
Это задание будем выполнять в течение нескольких уроков, в последствии модернизируя нашу игру.


Итак, приступаем. Создаем новый проект. Сохраним его как "u6.pas" и "Urok6.dpr". Для начала в раздел
"uses" добавим математическую библиотеку "Math". Она понадобится для расчета траектории полета снаряда
и др. математических вычислений. Разместим на форме компоненты: "Image1", "Button1", "TrackBar1",
"TrackBar2", и шесть компонент "Label". Задайте параметры в Инспекторе Объектов:
Image1:
Left - 16
Top - 16
Width - 560
Height - 350
Button1:
Left - 595
Top - 25
Caption - Огонь
TrackBar1:
Left - 595
Top - 65
Frequency - 10
Max - 90
Min - 1
Orientation - trVertical
TrackBar2:
Left - 585
Top - 235
Frequency - 10
Max - 100
Min - 0
Orientation - trHorizontal
Label1:
Caption - 45
Left - 640
Top - 120
Label2:
Caption - 20
Left - 620
Top - 280

Остальные параметры не существенны. Теперь, когда выполнены начальные установки, давайте начнем
программировать. Для начала, щелкнув два раза по форме, пишем в обработчике "FormCreate" следующий код:

procedure TForm1.FormCreate(Sender: TObject);
begin
// Запускаем генератор случайных чисел
randomize;
// Числа х и у задают центр мишени
// Заносим в х случайное число, лежащее в пределах от 0 до 280
x := random(280);
// Заносим в у случайное число, лежащее в пределах от 0 до 250
y := random(250);
// Очищаем Image1. Эту функцию напишем чуть ниже
ImCl;
// Рисуем цель в виде эллипса, с центром в (х,у) и диаметром 20 пикселей
Image1.Canvas.ellipse(x, 300 - y, 20 + x, 300 - (y + 20));
end;


Теперь давайте напишем функцию для очистки Image1. Для этого в разделе "type" пишем
"procedure ImCl;", нажимаем Ctrl+Shift+C и пишем:

procedure TForm1.ImCl;
begin
// Задаем цвет пера как цвет фона формы
Image1.Canvas.Pen.Color := clBtnFace;
// Задаем цвет фона пера как цвет фона формы
Image1.Canvas.Brush.Color := clBtnFace;
// Очищаем Image1 путем рисования на ней квадрата
Image1.Canvas.Rectangle(0, 0, Image1.Width + 1, Image1.Height + 1);
// Задаем цвет пера как черный
Image1.Canvas.Pen.Color := ClBlack;
end;

Теперь давайте, определим "TrackBar1" для задания угла наклона пушки, а "TrackBar2" - для начальной
скорости. Кликнув по этим элементам 2 раза, пишем код:

Procedure TForm1.TrackBar1Change (Sender: TObject);
Begin
// Задание угла наклона
Label1.Caption := IntToStr(90 - TrackBar1.Position);
end;

procedure TForm1.TrackBar2Change(Sender: TObject);
begin
// Задание начальной скорости
Label2.Caption := IntToStr(TrackBar2.Position);
End;

Вот теперь можно приступать к программированию функции расчета и отображения траектории, и проверки попадания.

Стрелять будем, нажимая на кнопку, тогда в обработчике нажатия кнопки пишем:

procedure TForm1.Button1Click(Sender: TObject);
var
xo, yo, v, ug: Integer;
z, iii: Real;
label
endd;
begin
xo := 0;
iii := 0;
// Заносим начальную скорость
// функция StrToInt преобразует строку в целое число
v := StrToInt(Label2.Caption);
// Заносим угол наклона пушки
ug := StrToInt(Label1.Caption);
// Переводи угол из градусов в радианы
z := ug / 57.3;
// Организуем цикл до тех пор, пока снаряд не пролетит мима мишени
while xo < x + 20 do
begin
// Переменная iii - является счетчиком времени
iii := iii + 0.01;
// Расчет раектории
yo := 300 - floor(iii * v * SIN(z) - 5 * iii * iii);
xo := 10 + floor(iii * v * COS(z) - 5 * iii + 1);

// Далее идет проверка траектории

// Если пуля улетает влево, то - выход
if xo < 0 then
goto endd;
// Если пуля улетает вниз, то - выход
if yo > 300 then
goto endd;
if yo >= 0 then
begin
if yo <= 300 then
begin
// Если пуля вправо и вверх, то - отображение
Image1.Canvas.Pixels[xo, yo] := clYellow;
// Проверка попадания пули в цель
if xo > x then
begin
if xo < x + 20 then
begin
if yo < (300 - y) then
begin
if yo > (300 - (y + 20)) then
begin
// Если попали, отображаем соответствующую надпись
Label6.Caption := 'Попал!';
end; end; end; end; end; end; end;
endd:
end;

Вот и все! Игра готова. На следующих уроках будем совершенствовать наше произведение. :)

(c) Юрий М. Крылов, 2004.

Рассылка comp.soft.prog.delphibegin (c)2003-2004 Крылов Ю.М.
Выпуск 4 от 2004-04-17
Подписчиков - 5
Рассылки Subscribe.Ru
Новости сайта My.WAP.F1

http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу


В избранное