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

19.4. Получаем координаты прицела

Основной проблемой в механизме обработки выстрелов по мячам является различие координат в положении на экране двухмерного прицела и трехмерной модели. Как вы знаете, двухмерная плоскость имеет свою систему координат, а трехмерная плоскость - свою. У нас в игре одним из основных механизмов игровой логики является обработка выстрелов в мячики, где нам необходимо сопостав-

314 Стреляем по целям

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

В справочной информации по студии XNA Game Studio Express имеется показательный пример получения и переноса двухмерных координат спрайта в трехмерную плоскость. Мы воспользуемся этим примером, который состоит из двух частей. Первая часть примера представлена методом GetPickRay(), где происходят получение текущих координат прицела и перенос их в трехмерное пространство.

Ray GetPickRay() {

// задаем позицию прицела в центре изображения мушки

float cursorX = cursor.spritePosition.X + cursor.spriteTexture.Width/2; float cursorY = cursor.spritePosition.Y + cursor.spriteTexture.Height/2;

Vector3 nearsource = new Vector3(cursorX, cursorY, 0f); Vector3 farsource = new Vector3(cursorX, cursorY, 1f); // мировая матрица, все значения ставим в ноль world = Matrix.CreateTranslation(0, 0, 0); // матрица вида

view = Matrix.CreateLookAt(camera, Vector3.Zero, Vector3.Up); // матрица проекции

proj=Matrix.CreatePerspectiveFieldOfView(FOV,aspectRatio,nearClip,farClip); // ближняя точка

Vector3 nearPoint = graphics.GraphicsDevice.Viewport.Unproject(nearsource, proj, view, world); // дальняя точка

Vector3 farPoint = graphics.GraphicsDevice.Viewport.Unproject(farsource, proj, view, world);

Vector3 direction = farPoint - nearPoint; direction.Normalize();

Ray pickRay = new Ray(nearPoint, direction); return pickRay;

}

Сложный метод, но его можно рассматривать как часть объектно-ориентированного программирования, когда совсем не обязательно знать, как работает тот или иной метод или класс. Суть метода GetPickRay() заключается в переносе двухмерных координат прицела в трехмерное пространство посредством матричных преобразований, и здесь имеется один очень важный нюанс.

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


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

Горяченькое

Друзья

Hosted by uCoz