6. Трёхмерный курсор. В этот
раз я покажу, как можно управлять объектом с помощью мышки. Итак,
берём шаблон:
Здесь
мы создаём всё, что нам нужно, расставляем и создаём цикл. Новые команды: CreateSphere(количество сегментов) – Создаёт сферу (а то чего мы всё куб да куб J)
в скобках указываем количество сегментов – 8 = 224 полигона, 16 = 960
полигонов и 32 = 3968 полигонов. Естественно, чем больше полигонов, тем
«круглее» наш шарик, и тем больше памяти он занимает. EntityColor объект, красный, зелёный, синий – Эта команда закрашивает данный объект цветом RGB, где указывается сколько должно быть красного,
зелёного, синего цвета, значения которых могут быть от 0 до 255. Вот,
например, 0,0,0 – чёрный цвет, 255,255,255 – белый, 0,255,0 – самый зелёный J… Теперь
насчёт мышки. Хотя курсор и не показывается на экране, на самом деле он есть
– то есть он двигается, если вы двигаете мышку, остаётся только определить на
сколько. Просто поставьте эти команды в начале цикла:
Так,
что эта вся хрень значит? Поясняю. MouseXSpeed() – это
функция, которая говорит нам об изменении X координаты мышки на
экране, с момента последнего вызова этой функции. Ну короче, на сколько
пикселей её в последний раз передвинули (По X)! MouseYSpeed() – тоже самое, но по Y (Есть ещё MouseZSpeed() – это передвижение колёсика). MoveMouse x,y – устанавливает курсор мышки
в данную точку (это делается для того, чтобы он не подходил к краю, и мы
всегда могли бы узнать передвижение мышки… короче надо… J).
Итак,
мы знаем, на сколько у нас передвигается мышка с каждым кадром, осталось
только передвигать сферу, в зависимости от передвижения мышки (данные о
передвижении находятся у нас в переменных mx и my):
Теперь
можно запускать программу… да не трогайте вы клавиатуру – теперь кубик можно передвигать
мышкой! Правда кубик какой-то гиперактивный… нужно сбавить ему скорость –
просто заменим эту строчку на:
Так
будет намного удобнее! Всё – у нас есть трёхмерный курсор! Но мы
на этом не остановимся!!! Мы пойдём дальше! Сделаем так, чтобы камеру можно
было вертеть:
Если
вы теперь запустите программу, то обратите внимание, что когда камера повёрнута
нормально (как стоит в начале) – то всё как бы нормально – двигаешь мышку
влево, сфера двигается влево, двигаешь вперёд – и сфера двигается вперёд… но
стоит нам повернуться на 90 градусов влево, как становится совсем неудобно:
передвигаешь мышку влево – курсор уходит вперёд, передвигаешь мышку вперёд –
курсор уходит вправо! А если повернуться на 180 градусов – то всё вообще
становится наоборот. Почему же происходит такое неправильное движение?
Вообще-то движение-то правильное – оно как было, так и осталось – просто мы
теперь смотрим на это под другим углом. Что же теперь камеру не вертеть что
ли? Конечно нет! Настоящие программеры не сдаются! (…они просто ленятся… J)
Значит будем думать вместе… хм… это… э-э-э…а может?… хотя нет…э… дА! Есть
идея! Смотрите: Сфера всегда повёрнута прямо. Когда камера повёрнута прямо,
получается так, что их оси совпадают по направлению, а когда камера повёрнута
налево, то получается что её ось X совпадает с
осью Z сферы. Ну в общем такая фи гня… короче, надо сделать
так, чтобы их оси совпадали, говоря человеческим языком – чтобы они
направлены были в одну сторону! Но как это сделать? …………………………………………J Очень
просто! Так:
…или
так (результат один и тот же):
Итак
новые командосы J: EntityPitch#(объект) –
функция, возвращающая угол наклона данного объекта относительно оси X мировой системы координат EntityYaw#(объект) - -//-
по оси Y EntityRoll#(объект) - -//-
по оси Z RotateEntity объект, X,Y,Z – В общем похожа на команду TurnEntity (тем, что она объект поворачивает), вот только делает
она это относительно мировой системы координат, а не системы координат
объекта. А
теперь у нас есть курсор, которому позавидует любой программер
(программирующий в 2Д J)! |
Оглавление: 0. Введение 5. 2Д в 3Д 7. Родительская зависимость или Привязки 9. Коллизион Детекшн или как устроен мир… 10. Первая 3Д игра. Часть 0 – основы движка 11. Первая 3Д игра. Часть 1 – разработка движка 12. Первая 3Д игра. Часть 2 – устранение багов 13. Первая 3Д игра. Часть 3 – внешний вид 14. Первая 3Д игра. Часть 4 – от массива к спискам 15. Первая 3Д игра. Часть 5 – оптимизация кода 16. Первая 3Д игра. Часть 6 – завершение 17. Выведение |