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

В отличие от класса BoundingBox, с которым мы имели дело во второй части этой книги, класс BoundingSphere создает не ограничивающий прямоугольник или куб, а ограничивающую сферу. Наши модели мячиков круглые, поэтому этот класс подходит для нас как нельзя кстати.

Сейчас давайте «залезем» прямо в исходный код метода MouseClick(), который направлен на определение столкновений между прицелом и мячами, и по ходу его изучения прокомментируем суть работы этого метода.

void MouseClick() {

Сначала мы получаем текущие координаты мыши и передаем их нашему прицелу.

mouseState = Mouse.GetStateO; cursor.spritePosition.X = mouseState.X; cursor.spritePosition.Y = mouseState.Y;

Затем создается проверка условия для обработки нажатия левой кнопки мыши. Это условие в переводе на русский язык звучит так. Если левая кнопка мыши нажата и координаты мыши совпадают с координатами ограничивающей сферы одного из мячей, то происходят выстрел и попадание, а мячик устанавливается на новую позицию на экране.

if (mouseState.LeftButton == ButtonState.Pressed)

{

Ray pickRay = GetPickRay();

Nullable<float> result0 = pickRay.Intersects(bb[0]); if (result0.HasValue == true)

В следующем блоке кода выбирается новая позиция на экране для мячика под номером ноль. Выбор позиции мячика аналогичен первоначальному выбору позиции при старте всей игры.

Ьа11[0].ровіиіоп.Х = гапО.Мехи(-(гапО.Ыехи(0, 80)), гапО.Ывхи(0, 80));

Ьа11[0].рові1;іоп.У = гапО.Ывхи(0, 80); Ьа11[0].ровіиіоп^ = -(гапО.Ывхи(20, 150));

Nullable<float> resultl = pickRay.Intersects(bb[l]);

if (resultl.HasValue == true)

{

ball[l].position.X = rand.Next(-(rand.Next(0, 80)), rand.Next(0, 80));

ball[l].position.Y = rand.Next(0, 80); ball[l].position.Z = -(rand.Next(20, l50));

}

Nullable<float> result2 = pickRay.Intersects(bb[2]); if (result2.HasValue == true)

{

ball[2].position.X = rand.Next(-(rand.Next(0, 80)), rand.Next(0, 80));

ball[2].position.Y = rand.Next(0, 80); ball[2].position.Z = -(rand.Next(20, l50));

Здесь создается цикл, где на каждый мячик надевается своя сфера с радиусом, установленным в классе ModelClass.

for (int i = 0; bb.Length > i;

{

bb[i].Center = ball[i].position; bb[i].Radius = ball[i].radius;

Обработку событий по пересечению сферы и прицела можно поместить и в цикл, например следующим образом:

for (int i = 0; ball.Length > i;

{

Nullable<float> result = pickRay.Intersects(bb[i]); if (result.HasValue == true)


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

Горяченькое

Друзья

Hosted by uCoz