Вход/Регистрация
Программирование КПК и смартфонов на .NET Compact Framework
вернуться

Климов Александр Петрович

Шрифт:

Обнаружение столкновений

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

Рис. 11.4. Ограничивающий прямоугольник для объекта

Две точки позволяют оперировать координатами верхнего левого и нижнего правого углов прямоугольника. В .NET Compact Framework существует структура

RECTANGLE
, использующая эти координаты для реализации прямоугольника. Несколько методов используют эту структуру для обнаружения пересечения двух прямоугольников. С их помощью и можно обнаружить столкновение объектов. Ранее использовавшиеся переменные надо заменить структурой
RECTANGLE
, в которой будет содержаться информация о местонахождении объекта. Соответствующий код приведен в листинге 11.17.

Листинг 11.17

/// <summary>

/// Позиция и ограничивающий прямоугольник для сыра

/// </summary>

private Rectangle cheeseRectangle;

/// <summary>

/// Позиция и ограничивающий прямоугольник для батона хлеба

/// </summary>

private Rectangle breadRectangle;

Сразу после загрузки изображений надо ввести код, приведенный в листинге 11.18.

Листинг 11.18

// Получим координаты и ограничивающие прямоугольники

cheeseRectangle = new Rectangle(0, 0, cheeseImage.Width.cheeseImage.Height);

breadRectangle = new Rectangle(0, 0, breadImage.Width, breadImage.Height);

Теперь для вывода картинок на экран надо использовать в методе

Form1_Paint
код, приведенный в листинге 11.19.

Листинг 11.19

g.DrawImage(breadImage, breadRectangle.X, breadRectangle.Y);

g.DrawImage(cheeseImage, cheeseRectangle.X, cheeseRectangle.Y);

При помощи свойств

X
и
Y
этих прямоугольников можно перемещать объекты по экрану. В методе
updatePosition
надо заменить часть кода, отвечающую за движение сыра и батона, с учетом созданных переменных, как показано в листинге 11.20.

Листинг 11.20

private void updatePositions {

 // Движение кусочка сыра

 if (goingRight) {

cheeseRectangle.X += xSpeed;

 } else {

cheeseRectangle.X -= xSpeed;

 }

 if ((cheeseRectangle.X + cheeseImage.Width) >= this.Width) {

goingRight = false;

 }

 if (cheeseRectangle.X <= 0) {

goingRight = true;

 }

 if (goingDown) {

cheeseRectangle.Y += ySpeed;

 } else {

cheeseRectangle.Y -= ySpeed;

 }

 if ((cheeseRectangle.Y + cheeseImage.Height) >= this.Height) {

goingDown = false;

 }

 if (cheeseRectangle.Y <= 0) {

goingDown = true;

 }

 // Управление батоном

 if (keyArgs != null) {

switch (keyArgs.KeyCode) {

case Keys.Up:

breadRectangle.Y -= ySpeed;

break;

case Keys.Down:

breadRectangle.Y += ySpeed;

break;

case Keys.Left:

breadRectangle.X -= xSpeed;

break;

case Keys.Right:

breadRectangle.X += xSpeed;

break;

}

 }

 /// и далее...

Когда сыр ударяется о батон хлеба, он должен отскочить. Этого эффекта можно добиться, просто изменив направления движения по оси Y в методе

updatePosition
, как показано в листинге 11.21.

Листинг 11.21

// Проверка на столкновение

if (cheeseRectangle.IntersectsWith(breadRectangle)) {

 goingDown = !goingDown;

}

Метод

IntersectsWith
принимает параметры прямоугольников. Если они пересекаются, то возвращается значение
True
, после чего меняется направление движения сыра.

  • Читать дальше
  • 1
  • ...
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: