Руководство по созданию 3D-игр.
В прошлом номере рассылки мы научились делать вид от третьего лица
(вид "из глаз" главного персонажа нашей игры) и создали туман.
Кстати, туман у нас отлично получился, но он не совсем реальный.
У настоящего тумана есть еще и фазы его появления и пропадания. Для
придания большей реалистичности нашей игре, давайте "оживим" туман.
Делается это так:
1. Для изменения плотности тумана будем менять значение в команде
FOG DISTANCE то увеличивая его, то уменьшая. Естественно, значение
в команду будем передавать с помощью переменной.
2. Чтобы плотность тумана не "болталась" туда-сюда, давайте
попробуем использовать новую команду TIMER(). Вот что написано о ней в
"Руководстве пользователя":
"Эта команда возвращает значение системного времени, постоянно
возрастающее в 1000 раз в секунду. Системное время выводиться в миллисекундах
(1000 милисекунд = 1 секунде). Синтаксис: Возвращаемое значение = TIMER()"
Отлично! С помощью этой команды мы можем "засечь" во сколько
у нас появился туман.
3. С помощью команды RND() мы можем вычислить продолжительность
неизменяемого состояния тумана, и проверять в игровом цикле командой TIMER()
"не настало ли время изменить плотность?". Если время пришло, вычисляем с помощью
команды RND() новую плотнось и плавно (в цикле) меняем значение FOG DISTANCE на
новое значение.
Ну вот, наметки для работы я вам дал. Что у вас получиться -
присылайте.
В следующем номере рассылки, мы рассмотрим типичные ваши ошибки и успехи! :-)
Сегодня начнем изучать последнюю часть "Руководства по созданию 3D-игр"
под названием "Игра". В ней 14 уроков, на которых вы узнаете как: загрузить
объекты (монстры, солдаты, дома и пр.) в игру, сделать управление с помощью мыши,
разместить трехмерные звуки, создавать эффектные взрывы, сделать радар и прочее.
Для более детальной и полной информации - рекомендую обратиться к
первоисточникам. А это компания "Медиахаус" и "Руководство пользователя",
которое вы получаете в коробке с лицензионным DarkBASIC-ом.
III. ИГРА
1. Загрузка объектов
Цель урока: научиться загружать объекты в 3D-сцену и строить фундамент игровой программы.
Существует множество различных приложений, способных создавать и сохранять 3D-модели. В DarkBASIC можно использовать как формат "X" DirectX, так и формат "3DS" 3DStudio. В отличие от стандартных примитивов DarkBASIC, модели этих форматов помогут вам создавать более реалистичные и богатые графикой сцены.
Sync
On
Sync
Rate 30
Hide
Mouse
autocam
off
Backdrop
on
Set
camera range 1,5000
Fog
on
Fog
distance 4000
Fog
color RGB(128,128,128)
Color
Backdrop RGB(128,128,128)
Rem
Создаем матрицу
Make
matrix 1,10000,10000,20,20
Rem
Текстурируем матрицу
Load
image "grass09.bmp",1
Prepare
matrix texture 1,1,1,1
Fill
matrix 1,0,1
rem
Присваиваем координатам вершин матрицы случайные значения
randomize
matrix 1,125
rem
Загружаем объект
Load
object "idle.x",2
position
object 2,5000,Get Ground Height(1,5000,5500),5500
Rem
Основной цикл
Do
set
cursor 0,0
print
X#
print
Y#
print
Z#
Rem
Сохраняем угол объекта
CameraAngleY#
= Camera angle Y()
Rem
Управление перемещением камеры
If
Upkey()=1
XTest# = Newxvalue(X#,CameraAngleY#,20)
ZTest# = Newzvalue(Z#,CameraAngleY#,20)
If XTest#>0 and XTest#<10000 and ZTest#>0 and ZTest#<10000
Move camera 10
Endif
Endif
If
Leftkey()=1 then Yrotate Camera Wrapvalue(CameraAngleY#-5)
If
Rightkey()=1 then Yrotate Camera Wrapvalue(CameraAngleY#+5)
X#
= Camera position X()
Z# = Camera position Z()
Y#
= Get ground height(1,X#,Z#)
Position
Camera X#,Y#+35,Z#
Rem
Обновляем экран
Sync
Loop
Прежде всего, введем несколько полезных команд.
Hide
Mouse
Команда "Hide mouse" убирает с экрана курсор мыши. В большинстве случаев в 3D-сценах курсор мыши на экране вам не понадобится.
autocam off
Команда "Autocam Off" выключает режим автоматической камеры. Когда этот режим включен, то при создании каждого новый объект в DarkBASIC, камера перемещается для того, чтобы показать этот объект. Если загружается большое число объектов, камера будет показывать каждый из них по мере загрузки. Выключение этого режима также играет свою роль при загрузке матрицы. Когда режим автоматической камеры выключен, камера устанавливается в центр созданной вами матрицы. Если режим включен, то камера будет установлена в позицию с координатами (0,0,0) в 3D-сцене.
Load object "idle.x",2
"Load Object" - основная команда для загрузки объекта в DarkBASIC. Первый параметр этой команды - имя файла объекта, загружаемого в 3D-сцену. Чтобы команда распознала имя файла, оно должно быть заключено в кавычки. Второй параметр команды - это номер, назначаемый данному объекту. Эта команда очень похожа на команды "Make Object". Все команды для работы с объектами, описанные в предыдущих уроках, будут работать с загруженными объектами точно так же, как они работают с объектами, созданными в DarkBASIC.
Loop
object 2
Команда "Loop Object" осуществляет циклическую анимацию загруженного в DarkBASIC объекта. Если загруженный объект не содержит данных об анимации, использование этой команды может вызвать ошибку. Создавая анимированный объект в специальной программе, обратите внимание на плавность анимации в цикле, в противном случае будет наблюдаться дергающееся движение при переходе модели от последнего к первому кадру анимации.
2. Управление при помощи мыши
Цель урока: объяснить, как использовать команды мыши для перемещения камеры.
Во многих играх используется такое свойство настройки, как "mouse look", позволяющая поворачивать камеру перемещением мыши. Это более эффективный метод управления камерой, чем управление с клавиатуры.
Sync
On
Sync
Rate 30
hide
mouse
Backdrop
on
Set
camera range 1,5000
Fog
on
Fog
distance 4000
Fog
color RGB(128,128,128)
Color
Backdrop RGB(128,128,128)
Rem
Создаем матрицу
Make
matrix 1,10000,10000,20,20
Rem
Текстурируем матрицу
Load
image "grass09.bmp",1
Prepare
matrix texture 1,1,1,1
Fill
matrix 1,0,1
rem
Присваиваем координатам вершин матрицы случайные значения
randomize
matrix 1,125
X#=5000
Z#=5000
Rem
Основной цикл
Do
OldCamAngleY#
= CameraAngleY#
OldCamAngleX#
= CameraAngleX#
CameraAngleY#
= WrapValue(CameraAngleY#+MousemoveX()*0.2)
CameraAngleX#
= WrapValue(CameraAngleX#+MousemoveY()*0.2)
Rem
Управление перемещением камеры
If
Upkey()=1
XTest# = Newxvalue(X#,CameraAngleY#,10)
ZTest# = Newzvalue(Z#,CameraAngleY#,10)
If XTest#>0 and XTest#<10000 and ZTest#>0 and ZTest#<10000
X#=XTest#
Z#=ZTest#
Endif
Endif
If
Downkey()=1
XTest# = Newxvalue(X#,Wrapvalue(CameraAngleY#-180),10)
ZTest# = Newzvalue(Z#,Wrapvalue(CameraAngleY#-180),10)
If XTest#>0 and XTest#<10000 and ZTest#>0 and ZTest#<10000
X#=XTest#
Z#=ZTest#
Endif
Endif
Yrotate
camera CurveAngle(CameraAngleY#,OldCamAngleY#,24)
Xrotate
camera CurveAngle(CameraAngleX#,OldCamAngleX#,24)
Y#
= Get ground height(1,X#,Z#)
Position
Camera X#,Y#+50,Z#
Rem
Обновляем экран
Sync
Loop
Вы уже заметили, что мы используем тот же код, что и в предыдущем уроке. В последующих уроках мы продолжим "надстраивать" этот код, чтобы в итоге создать завершенную игру.
OldCamAngleY#
= CameraAngleY#>
OldCamAngleX#
= CameraAngleX#
CameraAngleY# = WrapValue(CameraAngleY#+MousemoveX()*0.2)
CameraAngleX#
= WrapValue(CameraAngleX#+MousemoveY()*0.2)
Здесь в основном цикле мы сохраняем значения углов поворота камеры по осям Y и X в переменных "OldCamAngle" и после этого присваиваем новые значения переменным CameraAngle. Мы используем команду "WrapValue", чтобы значения углов находились в диапазоне от 0 до 360 градусов. Чтобы изменить значение переменных "CameraAngle", мы прибавляем к ним значения, возвращаемые командами "MouseMove", умноженные на поправочный коэффициент 0,2. Команды "MouseMoveX" и MouseMoveY()" возвращают относительное значение пространственных координат, на которое переместилась мышь с момента последнего считывания данных. Если быстро перемещать мышь вверх, вниз, вправо и влево, то возвращаемое значение будет намного больше, чем то, которое бы было при медленном перемещении мыши. Возвращаемое значение также зависит от размера экрана, используемого программой. Перемещение мыши со средней скоростью обычно возвращает значения от 8 до 16. Если эти значения прибавлять непосредственно к значениям углов поворота камеры, то скорость ее поворота будет слишком высокой. Нормализация этой величины путем умножения возвращаемого значения перемещения мыши на поправочный коэффициент 0,2 приводит к более приемлемым результатам.
Yrotate
camera CurveAngle(CameraAngleY#,OldCamAngleY#,24)
Xrotate
camera CurveAngle(CameraAngleX#,OldCamAngleX#,24)
Y#
= Get ground height(1,X#,Z#)
Position
Camera X#,Y#+50,Z#
После обработки всех значений, введенных с клавиатуры и мыши, мы поворачиваем камеру при помощи команд поворота камеры, используя команду "CurveAngle" для плавного перехода от старого угла положения камеры к новому. Первый параметр этой команды - новое значение угла, на который мы желаем повернуть камеру. Второй параметр - текущий угол поворота камеры. Третий параметр - скорость, с которой мы желаем перейти от старого к новому положению камеры. Команда "CurveAngle" изменяет это значение по кривой, в результате чего значение, используемое для вращения, находится в промежутке между старым и новым значением.
Заметьте интересный эффект поворота камеры, получаемый путем замены следующих двух строки кода
OldCamAngleY#
= CameraAngleY#
OldCamAngleX#
= CameraAngleX#
на
OldCamAngleY#
= Camera Angle Y()
OldCamAngleX#
= Camera Angle X()
с использованием команд "Camera Angle".
3. Боковое движение (стрейфинг)
Цель урока: Показать способ реализации бокового движения (стрейфинга).
Боковое движение (стрейфинг) - это отличный способ ловко уходить от ракет или в движении просматривать боковые пространства. Мы продемонстрируем, как реализовать этот режим с использованием клавиш "стрелка вправо" и "стрелка влево". Здесь мы приводим только ту часть кода, которая претерпела изменения по сравнению с предыдущим уроком. По мере добавления новых возможностей в нашей игре, код становится слишком большим, чтобы приводить его целиком.
If
Leftkey()=1
XTest# = Newxvalue(X#,Wrapvalue(CameraAngleY#-90),10)
ZTest# = Newzvalue(Z#,Wrapvalue(CameraAngleY#-90),10)
If XTest#>0 and XTest#<10000 and ZTest#>0 and ZTest#<10000
X#=XTest#
Z#=ZTest#
Endif
Endif
If
Rightkey()=1
XTest# = Newxvalue(X#,Wrapvalue(CameraAngleY#+90),10)
ZTest# = Newzvalue(Z#,Wrapvalue(CameraAngleY#+90),10)
If XTest#>0 and XTest#<10000 and ZTest#>0 and ZTest#<10000
X#=XTest#
Z#=ZTest#
Endif
Endif
Боковое движение реализуется с помощью команд "NewXValue" и "NewYValue", предназначенных для определения значений X# и Z# следующей позиции. Для определения координат перемещения влево, мы сначала вычитаем 90 градусов из текущего значения угла поворота камеры "CameraAngleY#", чтобы обозначить направление движения. Чтобы значение угла не превышало 360 градусов, мы применяем команду "WrapValue". Используя значение этого угла в командах "NewValue", мы определяем координаты точки, находящейся в 10 единицах пространственных координат левее. Новые координаты сохраняются в переменных "XTest" и "ZTest". Затем производится проверка этих переменных, чтобы убедиться, что новые значения находятся в пределах матрицы. Если проверка оканчивается успешно, то новые значения сохраняются в переменных "X#" и "Y#" и используются для перемещения камеры. Как вы помните из урока I:2, ось Y проходит от верхней к нижней части экрана, поэтому любой поворот вокруг оси Y будет параллельным по отношению к матрице.
В конце концов у вас должно получиться
следующее.
Это интересно...
|
Продолжаю знакомить вас с лучшими ОТЕЧЕСТВЕННЫМИ разработками.
Всем нам приходилось читать книги. С развитием компьютерной техники появился
вид книг в электронном виде - это файлы в тестовых форматах (txt, doc, rtf, htm).
Программа под названием ToM Reader от "Петровича" поможет вам с комфортом
читать книги на экранах ваших мониторов и даже более того - может "на ночь почитать
вслух". :-)) Поддерживает изменяемое внешнее оформление (skins) - можно читать
книгу и в виде современного издания, и в виде древнего фалианта. Очень красивое оформление!
Вы можете скачать дополнительные внешние оформления...
Программа сама отформатирует весь текст, для удобного чтения.
|
Цвет текста и его размер вы можете
выбрать сами или оставить принятое "по умолчанию". Но и это еще не все -
программа бесплатная! :-) Обязательно
посетите сайт автора программы
ToM Reader и скачайте ее последнюю версию. Разачарованными вы не будете!
Это лучший представитель, подобного рода, программ!
Выпуск закончил 3 октября 2002 года в 09:02 мск