Книга: Программирование КПК и смартфонов на .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
, после чего меняется направление движения сыра.
Запустите программу и попытайтесь отбить батоном движущийся кусочек сыра. Вы увидите, как сыр отскочит после столкновения.
- Начало работы
- Добавление изображения в программу
- Использование встроенных ресурсов
- Вывод картинки на экран
- Создание анимации
- Отражения
- Управление скоростью движения объекта
- Добавляем новый объект
- Устранение мерцания
- Хлеб — всему голова
- Обнаружение столкновений
- Столкновения батона и мяча
- Новые объекты
- Размещение помидоров
- Уничтожение томатов
- Счет игры
- Ведение счета
- Звуковые эффекты
- Дальнейшие улучшения
- И опять добавляем новые объекты
- Управление таблицей результатов
- Переключение между формами
- Отображение дочернего окна
- Получение имени игрока
- Хранение лучших результатов
- Улучшение графики
- Спрайты
- 2.2. Обнаружение столкновений между компонентами пользовательского интерфейса и реагирование на них
- Глава 2 Обнаружение адреса
- 10.2. Обнаружение жестов вращения
- 13.1. Обнаружение и испытание камеры
- 10.1. Обнаружение жестов смахивания
- Тест на обнаружение
- Глава 9. Проверка столкновений
- Обнаружение вершины
- 7.8 Обнаружение маршрутов
- 23.3.4 Обнаружение дублирования IP-адресов
- 23.3.5 Обнаружение непостижимости соседа
- Обнаружение нажатий клавиш