Как совместить разные виды движения

Попробуем совместить случайное движение и управляемое движение. Для этого рассмотрим такую несложную игру. По экрану в горизонтальном направлении слева направо движутся летающие тарелки. Они появляются в случайных местах и движутся со случайными скоростями. Как только очередная летающая тарелка, двигаясь слева направо, выходит за пределы экрана, она снова появляется в начале экрана слева в случайной позиции и начинает двигаться со случайной скоростью. Таким образом, создается иллюзия непрерывного движения разных объектов. В нижней части экрана находится пушка, которая может перемещаться во всех направлениях: влево, вправо, вверх и вниз с помощью стрелок. Пушка может расстреливать летающие тарелки снарядами нажатием клавиши Enter.

Для создания этой игры нужно нарисовать персонажей: пушку, летающую тарелку и снаряд в редакторе Image Editor.

Как совместить разные виды движения - student2.ru

В форме для отображения персонажей игра будем использовать компоненты:

Pushka:TImage – пушка;

FLY1, FLY2 : TImage – летающие тарелки;

Snar:TImage – снаряд.

Для организации движения летающих тарелок будем использовать таймер Timer1:Ttimer со значением свойства Interval, равным примерно 60. Для организации движения снаряда будем использовать таймер Timer2:TTimer со значением свойства Interval, равным примерно 1. В начале игры Timer2 выключен, т.е. свойство Enabled равно false, все тарелки и снаряд не видимы, т.е. их свойство Visible равно false.

Программный код, реализующий движение и выстрелы пушки пишется на событие OnKeyDown формы и имеет следующий вид:

case key of

VK_UP: if Pushka.top -10 > 0 then Pushka.top:=Pushka.Top - 10;

VK_Down: if Pushka.top +10 +Pushka.Height < ClientHeight then

Pushka.top:=Pushka.Top + 10;

VK_Left: if Pushka.Left - 10 >0 then Pushka.Left :=Pushka.Left -10;

VK_Right: if Pushka.Left +10 +Pushka.Width <ClientWidth then

Pushka.Left :=Pushka.Left +10;

VK_Return: begin

Snar.Top:= Pushka.Top - Snar.Height;

Snar.Left:=Pushka.Left+20;

Snar.Visible:=true;

Timer2.Enabled:=true;

end;

end;

При нажатии на клавишу Enter задаются координаты снаряда, он становится видимым и включается Timer2, который управляет движением снаряда.

Программный код, реализующий движение летающих тарелок пишется на событие таймера Timer1. Если летающая тарелка еще не на экране (свойство visible равно false), ее следует запустить на экран, как бы в полет. Тарелка помещается в случайную позицию экрана, ее свойству visible присваивается значение true. Для задания скорости движения летающей тарелки используется свойство объекта tag. Это свойство есть почти у всех объектов, оно может использоваться для нужд программиста. Будем его использовать для хранения информации о скорости полета тарелки, которой то же присваивается случайное значение в пределах от 1 до 5.

Если тарелка уже на экране нужно сместить ее на значение скорости.

Программный код приведен ниже:

if not fly1.Visible then

with fly1 do

begin

{координаты тарелки}

top:=random(200)+1;

left:=0;

visible:=true;

{скорость тарелки }

tag:=random(10)+5;

end

else

{ полет }

if fly1.left+fly1.Width<Form1.Width then

fly1.left:= fly1.left+fly1.tag

else

fly1.visible:=false;

За движение снаряда отвечает обработчик события OnTimer второго таймера Timer2. Пока снаряд не выйдет за границу экрана или не столкнется с летающей тарелкой, смещать его на 10 пикселей. В противном случае сделать его невидимым и выключить таймер Timer2.

If Snar.top>0 then

Snar.Top:=Snar.top - 10

else

begin

Snar.Visible:=false;

Timer2.Enabled:=false;

end;

Для создания фона игры можно на событие OnPaint формы написать программный код, который будет рисовать звездное небо – звезды в случайных местах.

Задание для самостоятельной работы

1. В игре, описанной выше, написать программный код, который будет определять, достиг ли выстрел цели и если достиг увеличивать счет игры, который необходимо выводить на экран.

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

Как совместить разные виды движения - student2.ru

Машина игрока  
Как совместить разные виды движения - student2.ru

3. Используя элементы предыдущей игры придумать сюжет игры самостоятельно.

Использование мыши

Для управления мышью можно использовать следующие события формы или элемента управления:

1. OnMouseDown – выполняется при нажатии на кнопку мыши, возможно в комбинации с управляющей клавишей Shift, Ctrl, и Alt.

2. OnMouseMove – выполняется при перемещении мыши;

3. OnMouseUp – выполняется при отпускании кнопки мыши.

Заголовок процедуры обработчика события OnMouseDown имеет следующий вид:

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

Процедуре передается на вход 5 параметров:

Sender – указатель на объект-источник события

Button – позволяет определить какая кнопка мыши была нажата: левая, правая или средняя.

Shift – позволяет определить какая управляющая клавиша была нажата

X,Y – координаты, относительно клиентской части объекта Sender. Например, если это форма, то координаты точки, относительно окна, где нажали мышкой.

Процедуре обработки события OnMouseMove, как видно из заголовка

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);

передается 4 параметра, значения которых аналогичны.

Процедуре обработки события OnMouseUp, как видно из заголовка

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

передается 5 параметров, где X,Y это координаты, куда переместилась мышь.

Можно продемонстрировать использование управления мышкой на следующих примерах.

Пример 1. Например, при нажатии на мышку начинаем рисовать линию, при отпускании – завершаем рисование.

Как совместить разные виды движения - student2.ru

Для реализации этого упражнения будем использовать события мыши самой формы. Создадим либо в секции Interface или на верхнем уровне секции реализации переменную pr:

Var pr:Boolean;

Переменная pr – это признак того, что было нажатие мыши. Эта переменная необходима нам, чтобы код на событие OnMouseMove выполнялся только в случае, если было нажатие мыши. Начальное значение переменной pr, равное false, задается на событие формы OnCreate.

procedure TForm1.FormCreate(Sender: TObject);

begin

pr:=false;

end;

При нажатии мыши (событие OnMouseDown) необходимо включить флажок pr и перевести курсор в позицию, где была нажата мышь:

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

pr:=true;

Canvas.Moveto(x,y);

end;

При движении мыши (событие OnMouseMove) необходимо проверить было ли нажатие мыши, и если было, то провести линию в точку, куда переместилась мышь:

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,

Y: Integer);

begin

if pr then Canvas.Lineto(x,y);

end;

На событие OnMouseUp необходимо сбросить флажок pr в false:

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

pr:=false;

end;

Пример 2. Пусть в окне есть некоторый элемент, например картинка Image1: TImage, который необходимо переместить мышкой в другое место. Для того, чтобы перетащить объект, необходимо щелкать на самом объекте. Поэтому будем использовать все события мыши, связанные с самим объектом Image1.

В этом случае также необходимо завести переменную флажок, которая будет сигнализировать о том, что было нажатие мыши. При нажатии мыши на объекте будет выполняться его событие: Image1MouseDown, код которого приведен ниже:

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

pr:=true;

end;

При отпускании мыши флажок сбрасывается:

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

pr:=false;

end;

При перемещении мыши проверяется, было ли нажатие, если было, то необходимо сместить картинку:

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState;

X,Y: Integer);

begin

if pr then

begin

Image1.Top:=Image1.Top+y;

Image1.Left:=Image1.Left+x;

end;

end;

При этом X и Y это координаты смещения мышки относительно объекта.

Наши рекомендации