Руководство по созданию 3D-игр.
Наверстываем упущенное время и сразу переходим к урокам.
Задание данное вам на прошлом уроке, я надеюсь вы выполнили.
Напишите мне и пришите исходные тексты полученного у вас тумана.
В следующей рассылки мы рассмотрим алгоритмы и попытаемся следать их проще.
Для более детальной и полной информации - рекомендую обратиться к
первоисточникам. А это компания "Медиахаус" и "Руководство пользователя",
которое вы получаете в коробке с лицензионным DarkBASIC-ом.
III. ИГРА
4.Стрельба
Цель урока: показать, как реализовать стрельбу в режиме вида от первого лица.
В этом уроке объясняется, как создать оружие и стрелять из него в режиме вида от первого лица. Как и в предыдущем уроке, мы добавляем новые строки к существующему коду. Мы обсудим только изменения в коде, связанные с реализацией оружия и стрельбы.
remСоздаем пушку
Make object cylinder 1,2
XRotate Object 1,90
Fix object pivot 1
Scale object 1,100,100,500
position object 1,0,-7,15
Lock object on 1
Эта часть кода, помещенная перед основным циклом, создает цилиндрический объект и поворачивает его под прямым углом по отношению к установленному по умолчанию виду из камеры. Чтобы сделать такую ориентацию объекта ориентацией по умолчанию, мы используем команду "Fix Object Pivot". Это означает, что углы поворота повернутого объекта устанавливаются равными 0 без смены ориентации объекта. Эта команда часто используется для загрузки моделей с нефиксированной ориентацией. Если загружается модель персонажа, а он лежит лицом вниз, то с помощью этой команды можно повернуть модель так, что персонаж будет стоять. Точка вращения объекта фиксируется для того, чтобы сделать текущее положение объекта положением по умолчанию. После выравнивания объекта по отношению к камере, мы используем команду "Scale Object" для масштабирования объекта в направлении оси Z. Таким образом, создается объект - вытянутый ствол пушки. Первый параметр этой команды - номер объекта для масштабирования. Следующие три параметра команды - направления X, Y и Z, в которых мы хотим масштабировать объект. Мы устанавливаем значение масштабирования по осям X и Y равным 100, что не приводит к изменению масштаба объекта в этих направлениях, так как эта величина представляет собой процентное отношение (100%). Масштабирование по оси Z мы указываем равным 500. Это означает, что размер объекта по оси Z будет увеличен в пять раз. Затем мы позиционируем объект. По умолчанию камера установлена в позицию с координатами (0,0,0) и углами поворота (0,0,0). Мы размещаем цилиндр на 7 единиц пространственных координат ниже камеры и на 15 единиц впереди камеры. Таким образом, создается сходство со стволом пушки.
Rem Создаем снаряд
Make
Object Sphere 2,2
Hide
Object 2
Этот код создает небольшой сферический объект, применяемый в игре в качестве снаряда. Чтобы скрыть объект, мы используем команду "Hide Object". Причина, по которой мы это делаем, заключается в том, что снаряд не должен быть виден до тех пор, пока мы не выстрелим из пушки.
if Mouseclick()=1 and BulletLife=0
Position object 2,X#,Y#+43,Z#
Set object to camera orientation 2
BulletLife =25
show object 2
Endif
В этой части кода описывается ввод данных при нажатии кнопки мыши. Затем задаются координаты снаряда при выстреле из пушки. Чтобы определить, была ли нажата кнопка мыши, мы используем команду "MouseClick()". Эта команда возвращает номер нажатой кнопки мыши: 1 - для левой кнопки, 2 - для правой, и 0 - если ни одна из кнопок не была нажата. Сравнение "if" также проверяет, не был ли снаряд уже выпущен, сравнивая значение переменной "BulletLife" с 0. Если обе проверки проходят успешно, то объект "снаряд" помещается на семь единиц ниже камеры. После этого он позиционируется по отношению к камере при помощи команды "Set Object To Camera Orientation". Эта команда имеет только один параметр - номер позиционируемого объекта. Так как снаряд только что создан, мы устанавливаем значение переменной "BulletLife" равным 25. Чтобы программа произвела рендеринг объекта-снаряда, используем команду "Show Object".
If BulletLife > 0
Dec BulletLife
Move object 2,20
if BulletLife = 0 then Hide object 2
Endif
Эта часть кода отвечает за перемещение снаряда. Если значение переменной "BulletLife" больше нуля, то выполняется команда "Dec", уменьшающая это значение на единицу. Одновременно снаряд перемещается в направлении выстрела на 20 единиц. Затем снова проверяем значение переменной "BulletLife". Если оно равно 0, то "жизнь" снаряда закончилась и мы снова "прячем" этот объект.
Теперь вы можете добавить стрельбу в вашу игру.
5.Обычный звук и 3D-звук
Цель урока: показать, как загрузить и позиционировать источники 3D-звука.
В предыдущем уроке мы показали, как можно создать снаряд и стрелять. А сейчас добавим звуковые эффекты, чтобы выстрел в игре был более натуральным. Поскольку мы будем достаточно часто использовать переменные "CameraAngle", мы сократили их до аббревиатуры "cA" для удобства чтения кода.
Load
sound "crickets.wav",1
Loop
sound 1
Прежде чем мы рассмотрим 3D-звук, нам не помешает добавить в игру какой-нибудь звук окружающей среды. Команда "Load Sound" загружает звук в программу, но не воспроизводит его. Первый параметр этой команды - имя загружаемого звукового файла. Как и в любой другой команде, где требуется указывать имя файла, имя файла должно быть заключено в кавычки. Второй параметр команды - присвоенный этому звуку номер. DarkBASIC использует этот номер точно так же, как и при загрузке объектов или изображений. Номер является уникальным идентификатором для этого звука. Команда "Loop Sound" использует один параметр, номер воспроизводимого звука. Эта команда постоянно воспроизводит указанный звуковой файл. Понадобилось всего две команды, чтобы озвучить игру стрекотанием сверчков!
Load
3Dsound "fireball2.wav",2
Команда "Load 3DSound" загружает звук выстреливаемого снаряда. Первый параметр этой команды - имя загружаемого звукового файла, а второй параметр - присвоенный этому звуку номер. Загружая трехмерный звук, мы сообщаем DarkBASIC, что желаем поместить источник звука в определенной точке 3D-сцены.
Rem
Поворачиваем камеру
if
cAX#>270
if cAX#-270 > 90 then cAX#=270
else
if cAX# > 90 and cAX#-270<270 then cAX#=90
endif
YRotate
camera CurveAngle(cAY#,oldcAY#,24)
XRotate
camera CurveAngle(cAX#,oldcAX#,24)
Эта часть кода добавлена в игровую программу для того, чтобы игрок случайно не перевернул камеру. Углы камеры также должны содержать корректную информацию для правильного позиционирования слушателя 3D-звука.
Rem
Позиционируем слушателя
Position
Listener X#,Y#+50,Z#
Rotate
Listener 0,cameraAngleY#,0
Команда "Position Listener" используется для позиционирования источника звука. Три параметра после команды обозначают координаты X, Y и Z, где вы хотите поместить слушателя. Мы будем использовать ту же позицию, в которой расположена камера. Команда "Rotate Listener" служит для поворота слушателя. Ее параметры - это углы X, Y и Z. Чтобы направление слушателя совпадало с направлением камеры, мы оставим значения углов X и Z равными 0, и будем учитывать только вращение вокруг оси Y. Для определения значения Y используем переменную "CameraAngleY#".
Rem
Выстреливаем снаряд
if
Mouseclick()=1 and BulletLife=0
Position object 2,X#,Y#+43,Z#
Set object to camera orientation 2
BulletLife =25
show object 2
Loop sound 2
Endif
В код, где мы проверяем, была ли нажата кнопка мыши, мы добавили команду "Loop sound", чтобы начал воспроизводиться звук выстреливаемого снаряда. Этот звук будет длиться до тех пор, пока не будет остановлен кодом, который проверяет время "жизни" снаряда.
If
BulletLife > 0
Dec BulletLife
Move object 2,20
bX#=Object position X(2)
bY#=Object position Y(2)
bZ#=Object position Z(2)
Position sound 2,bX#,bY#,bZ#
if BulletLife = 0
Hide object 2
stop sound 2
endif
Endif
В код стрельбы мы добавили две команды для обработки позиции и окончания звука. Команда "Position Sound" используется для размещения звука летящего снаряда в указанных 3D-координатах. Первый параметр этой команды - номер позиционируемого звука. Следующие три параметра определяют позицию, в которую помещен источник звука. Мы получили значения координат X, Y и Z снаряда и сохранили их в переменных "'bX#", "bY#" и "bZ#". Это и есть значения, используемые нами для позиционирования источника звука снаряда. Как только программа определит, что величина "BulletLife" достигла значения 0, применяется команда "Stop Sound" для прекращения воспроизведения звука.
6. Математические столкновения
Цель урока: показать, как реализовать простые математические столкновения.
Сейчас мы объясним, как использовать математические столкновения для проверки столкновения снаряда и цели. Математическое столкновение вычисляется быстрее обычного столкновения, так как последнее должно проверить большее число объектов в программе. Применив простую функцию математического столкновения, мы можем узнать, насколько близко снаряд находится от цели. Если расстояние между ними достаточно мало, мы можем с достаточной уверенностью сказать о том, что они столкнулись.
If
BulletLife > 0
Dec BulletLife
Move object 2,20
bX#=Object position X(2)
bY#=Object position Y(2)
bZ#=Object position Z(2)
Position sound 2,bX#,bY#,bZ#
set cursor 10,10
if Sqrt((mX# - bX#)^2 + (mY#+25 - bY#)^2 + (mZ# - bZ#)^2) <20
text 240,220 ,"Цель поражена"
BulletLife = 0
endif
if BulletLife = 0
Hide object 2
stop sound 2
endif
Endif
Следующие строки добавлены в ту часть кода, в которой проверяется время "жизни" снаряда.
if Sqrt((mX# - bX#)^2 + (mY#+25 - bY#)^2 + (mZ# - bZ#)^2) <20
text 240,220 ,"Цель поражена"
BulletLife = 0
endif
Это сравнение использует математическую функцию "Sqrt" для расчета расстояния между двумя объектами. Если расстояние меньше 20, то на экран выводится сообщение о том, что игрок поразил цель, и объект-снаряд прекращает свое существование путем установки времени "жизни" снаряда равным 0. Функция математического столкновения вычитает из значения координаты X цели, которое хранится в переменной mX#, значение координаты X снаряда. Затем это число умножается само на себя при помощи экспоненциальной операции " ^ ". Аналогичные вычисления осуществляются в отношении координат Y и Z. Заметьте, что мы добавили 25 к координате Y цели, так как это будет примерно соответствовать координате середины стоящей цели. Полученные значения складываются, и вычисляется квадратный корень полученной суммы. Окончательное значение можно рассматривать как расстояние между двумя объектами. Советуем запомнить эту строку кода на случай, если вам когда-либо потребуется определять расстояние между двумя точками в 3D-сцене.
Если вы не знакомы с квадратными корнями и экспонентами, вам придется обратиться к справочнику по математике, чтобы в деталях уяснить, как вычисляется расстояние. Знание того, чем являются переменные и значение, рассчитываемое по формуле, должно помочь вам в дальнейшем использовать эту часть кода в ваших собственных программах.
В конце концов у вас должно получиться
следующее.
Это интересно...
|
Подключаетесь ли вы к Интернету через обычный модем, или сверхбыстрый кабель, или ADSL, ReGet Deluxe использует это соединение на полную мощность для того, чтобы загрузить файлы быстрее. ReGet Deluxe имеет много возможностей, предназначенных для повышения эффективности и невероятного увеличения скорости загрузки. Все это делает ReGet Deluxe незаменимым инструментом для опытных пользователей Интернета и тех, кому приходится часто загружать файлы.
|
Кроме меня :-)) этой программой пользуются очень много людей, среди них
такие как знаменитый интернет-журналист Алекс Экслер, Дмитрий Турецкий и т.д.
От себя добавлю, что это замечательная программа! Вы можете
бесплатно скачать ее с сайта авторов из Санкт-Петербурга и пользоваться
30 дней. Но я бы рекомендовал один раз купить регистрацию и пользоваться
сколько душе угодно! Тем более, что не "вот каких" денег эта регистрация стоит,
а 250 рублей, а для студетнов, так и вообще 210 рублей.
Выпуск закончил 8 октября 2002 года в 12:01 мск