Приставки
Nintendo (Dendy)
Nintendo 64
Sega Genesis
Sega CD / 32x
Master System
Super Nintendo
Turbo Grafx 16
Sega Saturn
Sony PlayStation
GameBoy Advance
GameBoy / Color
Game Gear
Atari
Другие

Утилиты
Системные утилиты
GoodXXXX
Sega CD / 32x
Nintendo 64
Переводы, хакинг
Музыка

Мир приставочных игр

Версия 2.00a

Leonis © 2002-2009
Команда Новости Помощь Ссылки
ПОМОЩЬ
Литература про игры
Предыдущая Следующая

146 Игровые столкновения

Проект Collision 147

Рис. 10.2. Ограничивающий прямоугольник для платформы

bbplatform.Max = new Vector3(platform.spritePosition.X + platform.spriteTexture.Width,

platform.spritePosition.Y + 25 + platform.spriteTexture.Height, 0);

Вторая координата ограничивающего прямоугольника соответствует правому нижнему углу изображения платформы. Все оставшиеся стороны прямоугольника дорисовываются автоматически на основе этих двух точек. В итоге получается, что мы надели на спрайт ограничивающий прямоугольник размером в сам спрайт, а поскольку метод Collisions() постоянно вызывается в итерациях игрового цикла, то и координаты прямоугольника будут постоянно изменяться и соответствовать текущему положению платформы на экране. Такой подход позволяет нам не только создавать ограничивающие прямоугольники, но и отслеживать положение спрайтов на экране монитора.

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

// Создаем ограничивающий прямоугольник для sprite[0] bb[0].Min = new Vector3(sprite[0].spritePosition.X, sprite[0].spritePosition.Y, 0);

bb[0].Max = new Vector3(sprite[0].spritePosition.X + ширина одного фрейма, sprite[0].spritePosition.Y + высота одного фрейма, 0);

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

Вторая часть метода Collisions() направлена на определение столкновений между платформой и каждым спрайтом, падающим с неба. Для этого используется метод Intersects() структуры BoundingBox. Дословный перевод названия метода обозначает пересечение. То есть этот метод определяет, пересеклись между собой прямоугольники или нет, что равносильно определению столкновения между двумя спрайтами.

if (bbplatform.Intersects(bb[0]))

{

sprite[0].spritePosition = new Vector2(rand.Next(10, Window.ClientBounds.Width -

300 - sprite[0].spriteTexture.Width / 12), -500);

Дословно на русском языке строка исходного кода if(bbplatform. 1г^егзес^з(ЬЬ[0])) обозначает следующее: если ограничивающий прямоугольник платформы будет пересекаться с ограничивающим прямоугольником спрайта под номером ноль, то необходимо выполнить заданные действия. В качестве заданных действий в столкновении мы определяем, что нужно убрать прямоугольник с экрана и поставить его на новую игровую позицию в верхней части дисплея. После чего метод 1У^е8рг^е() заставит перемещаться этот спрайт в направлении сверху вниз или падать с неба. Если столкновение или пересечение ограничивающих прямоугольников не происходит, то спрайт уходит за пределы экрана и затем опять устанавливается на новую игровую позицию.


Предыдущая Следующая

Горяченькое

Друзья

Hosted by uCoz