Нажатие клавиш, движение камеры.И так. Продолжаем дорабатывать проект, который мы создали в 3-ом уроке. Мы уже научились запускать движок, загружать сцену, создавать камеру и выходить при нажатии на кнопку. Теперь научимся перехватывать нажатия не 1 клавиш, а так же не только момент нажатия но и отпускания. А так же научимся двигать камеру.
Для начала создадим 4 класса:
TForwKey =
class(TSystemMessage)
end;
TBackKey =
class(TSystemMessage)
end;
TRightKey =
class(TSystemMessage)
end;
TLeftKey =
class(TSystemMessage)
end;
Это классы для отправки сообщений.
Далее объявим 4 глобальных переменных:
ForwKeyRem:Boolean;
BackKeyRem:Boolean;
RightKeyRem:Boolean;
LeftKeyRem:Boolean;
Каждая из них будет принимать значение True когда кнопка нажата, и False когда отпущена.
Далее в обработчик нажатия на кнопку добавим:
Core.Input.BindCommand(ini.ReadString('Keys', 'forw', 'W')+'+', TForwKey);
Core.Input.BindCommand(ini.ReadString('Keys', 'forw', 'W')+'-', TForwKey);
Core.Input.BindCommand(ini.ReadString('Keys', 'back', 'S')+'+', TBackKey);
Core.Input.BindCommand(ini.ReadString('Keys', 'back', 'S')+'-', TBackKey);
Core.Input.BindCommand(ini.ReadString('Keys', 'right', 'D')+'+', TRightKey);
Core.Input.BindCommand(ini.ReadString('Keys', 'right', 'D')+'-', TRightKey);
Core.Input.BindCommand(ini.ReadString('Keys', 'left', 'A')+'+', TLeftKey);
Core.Input.BindCommand(ini.ReadString('Keys', 'left', 'A')+'-', TLeftKey);
Это и есть перехватчики нажатий на кнопки. Рассмотрим 2 первых строчки.
Core.Input.BindCommand(ini.ReadString('Keys', 'forw', 'W')+'+', TForwKey);
При нажатии на W отправить сообщение TForwKey. Именно «+» определяет что отправлять это сообщение при нажатии.
Core.Input.BindCommand(ini.ReadString('Keys', 'forw', 'W')+'-', TForwKey);
При отпускании W отправить сообщение TForwKey. Именно «-» определяет что отправлять это сообщение при отпускании.
То есть и при нажатии и при отпускании кнопки W мы посылаем сообщение TForwKey.
Далее, в обработчике сообещний напишем:
if Msg.ClassType = TForwKey
then ForwKeyRem:= not ForwKeyRem;
if Msg.ClassType = TBackKey
then BackKeyRem:= not BackKeyRem;
if Msg.ClassType = TRightKey
then RightKeyRem:= not RightKeyRem;
if Msg.ClassType = TLeftKey
then LeftKeyRem:= not LeftKeyRem;
Этим текстом каждый раз будем «переворачивать» переменную. С True на False и на оборот.
В обработчике таймера добавим переменную NewPosition: TVector3s; Не забываем добавить в
uses модель Base3D.
Так же допишем текст в обработчик таймера
if ForwKeyRem = True
thenbegin NewPosition:= Core.Renderer.MainCamera.GetPosition;
Core.Renderer.MainCamera.SetPosition( AddVector3s (NewPosition, ScaleVector3s(Core.Renderer.MainCamera.ForwardVector, 2) ));
end;if BackKeyRem = True
then
begin NewPosition:= Core.Renderer.MainCamera.GetPosition;
Core.Renderer.MainCamera.SetPosition( SubVector3s (NewPosition, ScaleVector3s(Core.Renderer.MainCamera.ForwardVector, 2) ));
end;
if RightKeyRem = True
then
begin NewPosition:= Core.Renderer.MainCamera.GetPosition;
Core.Renderer.MainCamera.SetPosition( AddVector3s(NewPosition, ScaleVector3s(Core.Renderer.MainCamera.RightVector, 2) ));
end;
if LeftKeyRem = True
then
begin NewPosition:= Core.Renderer.MainCamera.GetPosition;
Core.Renderer.MainCamera.SetPosition( SubVector3s(NewPosition, ScaleVector3s(Core.Renderer.MainCamera.RightVector, 2) ));
end;рассмотрим первый
if
if ForwKeyRem = True
then
begin NewPosition:= Core.Renderer.MainCamera.GetPosition;
Core.Renderer.MainCamera.SetPosition( AddVector3s (NewPosition, ScaleVector3s(Core.Renderer.MainCamera.ForwardVector, 2) ));
end;Если ForwKeyRem = True – будет складывать командой AddVector3s 2 вектора, тем самым заставляя камеру двигаться. Команда SubVector3s – это вычитание одного вектора из другого. Чтобы камера двигалась по живее, добавлено «ScaleVector3s» - это команда, с помощью которой мы увеличиваем вектор в 2 раза. Можно написать число больше или меньше, в зависимости от необходимой скорости движения камеры.
Компилируем, Запускаем. Теперь по нажатия на клавиш мы двигаемся!
Урок на этом окончен. Для любопытных выставляю проект со всеми файлами. Полностью рабочий.