Обнаружение столкновений
Обнаружение столкновений
Для контроля столкновений в играх используются прямоугольные области. Конечно, здесь далеко до реализма, так как предметы не всегда имеют прямоугольную форму. Но в некоторых случаях пользователь может и не заметить этого. Ограничивающий прямоугольник вокруг изображения хлеба выглядит так, как показано на рис. 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, после чего меняется направление движения сыра.
Запустите программу и попытайтесь отбить батоном движущийся кусочек сыра. Вы увидите, как сыр отскочит после столкновения.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
7.8 Обнаружение маршрутов
7.8 Обнаружение маршрутов Хотя многие локальные сети имеют единственный маршрутизатор по умолчанию, существует достаточное количество сетей, имеющих два или более маршрутизаторов.Что происходит при подключении маршрутизатора к локальной сети? Сообщения о
23.3.4 Обнаружение дублирования IP-адресов
23.3.4 Обнаружение дублирования IP-адресов Перед использованием IP-адреса локальной связи или любого другого адреса, который не был построен путем добавления префикса к адресу локальной связи, узел должен послать сообщение Neighbor Solicitation с целью узнать, имеет ли кто-то из
2.2. Обнаружение столкновений между компонентами пользовательского интерфейса и реагирование на них
2.2. Обнаружение столкновений между компонентами пользовательского интерфейса и реагирование на них Постановка задачи Требуется задать на экране границы столкновений между компонентами вашего пользовательского интерфейса так, чтобы эти компоненты не перекрывали друг
10.5. Обнаружение жестов-нажатий
10.5. Обнаружение жестов-нажатий Постановка задачи Необходимо фиксировать, когда пользователь нажимает экранный вид в той или иной
10.6. Обнаружение щипка
10.6. Обнаружение щипка Постановка задачи Необходимо предоставить пользователю возможность выполнять движения
13.1. Обнаружение и испытание камеры
13.1. Обнаружение и испытание камеры Постановка задачи Требуется узнать, есть ли камера на том устройстве с iOS, где работает ваше приложение, и можете ли вы получить доступ к этой камере. Это очень важный момент, который нужно проверить, прежде чем приступать к работе с
14.1. Обнаружение доступности многозадачности
14.1. Обнаружение доступности многозадачности Постановка задачи Необходимо выяснить, поддерживается ли многозадачность на том устройстве с iOS, на котором работает ваше
18.1. Обнаружение доступности акселерометра
18.1. Обнаружение доступности акселерометра Постановка задачи В вашей программе требуется определить, имеется ли в устройстве
18.2. Обнаружение доступности гироскопа
18.2. Обнаружение доступности гироскопа Постановка задачи В вашей программе требуется определить, имеется ли в устройстве
18.4. Обнаружение встряхивания устройства с iOS
18.4. Обнаружение встряхивания устройства с iOS Постановка задачи Необходимо узнавать, когда пользователь встряхивает устройство с
Обнаружение ошибок
Обнаружение ошибок Когда происходит ошибка в операции с потоком, устанавливается в ненулевое значение флажок ошибки для потока. Можно использовать макроопределение ferror, чтобы определить, произошла ли ошибка.После каждой ошибки флажок ошибки остается установленным до
17.4.4. Отложенное обнаружение ошибок
17.4.4. Отложенное обнаружение ошибок Начинающие программисты часто удивляются, почему некорректные определения классов AndQuery и OrQuery (в которых отсутствуют необходимые объявления конструкторов) компилируются без ошибок. Если бы мы не попытались определить фактический
Обнаружение устройств
Обнаружение устройств Теперь надо написать код для кнопки butFindDevs, предназначенной для обнаружения устройств. При тестировании примера необходимо направить инфракрасные порты устройств друг на друга. Код, ответственный за выполнение этой задачи, приведен в листинге
26.2.2. Обнаружение сигнала
26.2.2. Обнаружение сигнала Некоторые сигналы можно захватить и выполнить соответствующие действия. Другие сигналы нельзя уловить. Например, если команда получает сигнал 9, пользователю не нужно предпринимать какие?либо действия.Если ограничиться написанием сценариев,
Тест на обнаружение
Тест на обнаружение Суть теста в том, что в каждом тестируемом антивирусе запускалась задача сканирования по требованию каталога с огромным количеством вирусных экземпляров (detection rate test).Тест проводился на машине Intel Pentium 4 2600MHz, 512MB DDRAM с установленной Microsoft Windows XP Professional
Обнаружение вершины
Обнаружение вершины Нисходящий метод проектирования предполагает, что каждая система характеризуется на самом абстрактом уровне своей главной функцией. Хотя многие учебные примеры алгоритмических проблем - "Ханойские башни", "Задача о 8 ферзях" и т. п. - действительно