Цель урока: объяснить, как использовать команды мыши для перемещения камеры.
Во многих играх используется такое свойство настройки, как "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".