Приставки
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
Команда Новости Помощь Ссылки
ПОМОЩЬ
Литература про игры
Предыдущая Следующая

}

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

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

Проект Collision 195

public void Collisions() {

/* Первая часть */

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

bbplatform.Max = new Vector3(platform.spritePosition.X + platform.spriteTexture.Width, platform.spritePosition.Y + 45 + platform.spriteTexture.Height, 0);

// Создаем ограничивающие прямоугольники для спрайтов for (int i = 0; bb.Length > i;

{

bb[i].Min = new Vector3(sprite[i].spritePosition.X,

sprite[i].spritePosition.Y, 0); bb[i].Max = new Vector3(sprite[i].spritePosition.X +

sprite[i].spriteTexture.Width / 12,

sprite[i].spritePosition.Y+

sprite[i].spriteTexture.Height, 0);

}

/* Вторая часть */

// Проверяем столкновения между ковром и спрайтами for (int i = 0; bb.Length > i;

{

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

{

sprite[i].spritePosition = new Vector2(rand.Next(5 0, screenWidth - sprite[i].spriteTexture.Width/12 -50), -500);

}

}

}

И напоследок один небольшой секрет. Когда вы работаете с циклом for, то, как правило, вызов этого цикла происходит следующим образом:

for(int i = 0; 5 > i; {...}

Но есть и другой, более интересный способ создания цикла for:

for(int i = 5; — i >= 0;) {...}

Главным в этой записи является то, что такая формулировка цикла позволяет работать циклу примерно на 10-13% быстрее, чем его стандартная запись. В компьютерных играх (мощные системные ресурсы) это, конечно, не столь актуально, но вот в мобильных играх я постоянно использую только такую запись.


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

Горяченькое

Друзья

Hosted by uCoz