Предыдущая Следующая
Целимся и стреляем 315
19.5. Целимся и стреляем
После того как вы сформировали метод GetPickRay() для переноса координат прицела из одной плоскости в другую, можно приступать к работе над вторым методом, который будет обрабатывать уже непосредственно столкновение объектов в пространстве. Для начала объявим в классе Gamel новый объект bb класса BoundingSphere.
public BoundingSphere[] bb = new BoundingSphere[3];
В отличие от класса BoundingBox, с которым мы имели дело во второй части этой книги, класс BoundingSphere создает не ограничивающий прямоугольник или куб, а ограничивающую сферу. Наши модели мячиков круглые, поэтому этот класс подходит для нас как нельзя кстати.
Сейчас давайте «заберемся» прямо в исходный код метода GamePadClick(), который направлен на определение столкновений между прицелом и мячами, и по ходу его изучения прокомментируем суть работы этого метода.
void GamePadClick()
{
Сначала мы получаем состояние джойстика.
GamePadState currentState = GamePad.GetState(Playerlndex.One);
Затем с помощью GamePadThumbSticks.Left задается движение прицела по экрану телевизора.
if(currentState.ThumbSticks.Left.X < -0.65f)
cursor.spritePosition.X -= 10; else if(currentState.ThumbSticks.Left.X > 0.65f)
cursor.spritePosition.X += 10; if(currentState.ThumbSticks.Left.Y > 0.65f)
cursor.spritePosition.Y -= 10; else if(currentState.ThumbSticks.Left.Y < -0.65f)
cursor.spritePosition.Y += 10;
Чтобы прицел не выходил за пределы экрана телевизора, добавим в программу вот такую нехитрую конструкцию кода.
if(cursor.spritePosition.X < 0)
cursor.spritePosition.X = 0; else if(cursor.spritePosition.X > screenWidth — cursor.spriteTexture.Width)
cursor.spritePosition.X = screenWidth - cursor.spriteTexture.Width; if(cursor.spritePosition.Y < 0)
cursor.spritePosition.Y = 0; else if(cursor.spritePosition.Y > screenHight —cursor.spriteTexture. Hight)
cursor.spritePosition.Y = screenHight - cursor.spriteTexture.Hight;
316 Стреляем по целям
В этом блоке кода мы обрабатываем выход прицела за пределы экрана со всех четырех сторон.
Затем в теле метода GamePadClick() создается цикл, где на каждый мячик надевается своя сфера с радиусом, установленным в классе ModelClass.
for (int i = 0; bb.Length > i;
{
bb[i].Center = ball[i].position; bb[i].Radius = ball[i].radius;
}
Далее создается проверка условия для обработки нажатия правой кнопки Triggers.Right. Это условие в переводе на русский язык звучит так. Если правая кнопка Triggers.Right нажата и координаты прицела совпадают с координатами ограничивающей сферы одного из мячей, то происходит выстрел и попадание в цель, а мячик устанавливается на новую позицию на экране. Предыдущая Следующая
|