Добавить в цитаты Настройки чтения

Страница 14 из 18



int mouseY = e.Y;

//We set the coordinates of bread, equal to coordinates

//of mouse:

bx = mouseX;

by = mouseY;

}

Для удобства, задаём другие значения начальным координатам хлеба (например, int bx = 150; int by = 200;)

После запуска программы (Build, Build Selection; Debug, Start Without Debugging) сыр самостоятельно (без нашего участия) перемещается по экрану, отталкиваясь от границы со звуковым сигналом.

А после нажатий мышью четырёх кнопок Вверх, Вниз, Влево и Вправо мы можем перемещать батон хлеба в соответствующих четырёх направлениях по всему экрану (рис. 4.9).

На рис. 4.9 видно, что по умолчанию на форме выделена первая кнопка Button (на этой кнопке размещён фокус (Focus) программы), и поэтому данную кнопку мы можем нажать не только мышью, но и клавишей Enter, после чего скорость перемещения сыра возрастёт пропорционально количеству нажатий. Если мы желаем, чтобы по умолчанию была выделена другая, например, вторая кнопка Button, то в каком-либо методе, например, в методе Form1_Paint следует записать известный код (button2.Focus();). В режиме выполнения мы можем перемещать фокус, например, клавишами со стрелками или Tab на любую кнопку на форме, после чего воздействовать на эту кнопку клавишей Enter.

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

Следовательно, мы решили задачу по управлению объектом (в виде батона хлеба) при помощи элементов управления, например, кнопок Button и мыши.

Аналогично, как для события MouseMove, для управления игрой можно использовать методы-обработчики других событий мыши, которые имеются в панели Properties на вкладке Events для формы Form1 (рис. 4.11).

Рис. 4.11. События для управления игрой.

Отметим, что для управления игрой вместо кнопок Button (чтобы не загромождать форму) и мыши можно использовать и клавиши клавиатуры по описанной далее методике.

Однако при перемещении сыр может перекрыть батон хлеба (рис. 4.10), хотя по правилам игры, напомним, пользователь должен управлять перемещением хлеба, не давая сыру упасть вниз, а маленький кусочек сыра при столкновении должен отскочить от большого батона хлеба в противоположном направлении. Поэтому перейдём к решению задачи о столкновении летающих объектов (в следующей главе).

Таким образом, в этой главе мы разработали такие общие методики:

добавления объекта в проект;

анимации объекта;

проектирования отскока объекта от заданной нами границы, например, экрана;

управления скоростью перемещения объекта;

добавления звукового сигнала в ключевые для игры моменты, например, в момент столкновения объекта с границей;

добавления нового объекта в игру (с использованием общего для всех объектов кода);

устранения мерцания изображения при помощи двойной буферизации;

управления направлением перемещения объекта с помощью клавиш.

Эти методики можно использовать при разработке самых разнообразных игр.

Глава 5. Методика обнаружения столкновений, программирования уничтожений летающих объектов и подсчёта очков

5.1. Определение прямоугольников, описанных вокруг объектов

Продолжаем разработку методики создания типичной и широко распространённой игры, когда в качестве летающих игровых объектов используются продукты питания, следуя следующей статье с сайта microsoft.com:

Rob Miles. Games Programming with Cheese: Part Two.

Общие требования к программному обеспечению для разработки этой игры приведены выше.

Также продолжаем методично и последовательно решать типичные задачи по созданию данной и всех подобных игр.

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

Прямоугольник, описанный вокруг изображения батона хлеба bread.jpg, показан на рис. 5.1.

Рис. 5.1. Прямоугольник, описанный вокруг хлеба.

Ширина полей между объектом и описанным вокруг объекта прямоугольником должна быть сведена к минимуму, чтобы объект обязательно касался прямоугольника в как можно большем количестве точек и отрезков линий. Если начало прямоугольной системы координат “x, y” находится в верхнем левом углу экрана , то координаты верхней левой точки (bx, by) и нижней правой точки (bx + batWidth, by + batHeight) однозначно определяют данный прямоугольник на экране.

В среде выполнения .NET Framework (для настольных компьютеров) известна структура Rectangle (из пространства имён System.Drawing), у которой метод-конструктор Rectangle Constructor имеет несколько перегрузок. Наиболее применяемая перегрузка метода-конструктора Rectangle Constructor (которую далее и мы будем часто применять) с параметрами (Int32, Int32, Int32, Int32) структуры Rectangle на главных (в мире программирования) языках приведена в табл. 5.1.

Таблица 5.1.

Метод-конструктор Rectangle Constructor (Int32, Int32, Int32, Int32) структуры Rectangle.

Visual Basic (Declaration)

Public Sub New ( _

x As Integer, _

y As Integer, _

width As Integer, _

height As Integer _

Visual Basic (Usage))

Dim x As Integer

Dim y As Integer

Dim width As Integer



Dim height As Integer

Dim instance As New Rectangle(x, y, width, height)

C#

public Rectangle (

int x,

int y,

int width,

int height

)

C++

public:

Rectangle (

int x,

int y,

int width,

int height

)

J#

public Rectangle (

int x,

int y,

int width,

int height

)

JScript

public function Rectangle (

x : int,

y : int,

width : int,

height : int

)

В этом определении метода-конструктора Rectangle Constructor параметры переводятся так:

x – координата “x” верхнего левого угла прямоугольника;

y – координата “y” верхнего левого угла прямоугольника;

width – ширина (по оси “x”) прямоугольника;

height – высота (по оси “y”) прямоугольника.

Далее в нашей программе мы сначала объявим прямоугольники, описанные вокруг объектов, как новые переменные, например, так:

//The rectangle, described around the first object:

Rectangle cheeseRectangle;

//The rectangle, described around the second object:

Rectangle breadRectangle;

а затем в каком-либо методе создадим (при помощи ключевого слова new) и инициализируем эти объекты-прямоугольники, например, так:

cheeseRectangle = new Rectangle(cx, cy,

cheeseImage.Width, cheeseImage.Height);

breadRectangle = new Rectangle(bx, by,

breadImage.Width, breadImage.Height);

5.2. Обнаружение столкновения прямоугольников, описанных вокруг подвижных объектов

В этой структуре Rectangle (из пространства имён System.Drawing) имеются методы, которые могут обнаруживать пересечения различных перемещающихся прямоугольников. Эти методы определяют, находится ли точка одного прямоугольника внутри другого прямоугольника, и если находится, то программа определяет эту ситуацию и как столкновение этих двух прямоугольников, и как столкновение двух объектов, расположенных внутри этих прямоугольников.