CAST II Game Engine

   ОПИСАНИЕ       ВОЗМОЖНОСТИ       СКРИНШОТЫ       ФОРУМ       ДОКУМЕНТАЦИЯ       ФАЙЛЫ       КОНТАКТ   

Содержание

Введение в CAST II

Справочник

Уроки


Структура игрового приложения CAST II

Инициализация

Инициализация CAST II включает в себя семь шагов:

1. Для визуализации и ввода требуется идентификатор (handle) окна ОС. В комплекте CAST II есть модуль AppsInit, где объявлен класс TAppStarter. С помощью наследника этого класса, реализующего создание окна для Win32-приложений, можно создать окно так:

Starter := TWin32AppStarter.Create('CAST II Application', nil, [soSingleUser]);

У объекта Starter есть поле WindowHandle, являющееся нужным нам идентификатором окна.

2. Далее, нужно создать объект ядра TCore:

  uses C2Core;
  ...
  var Core: TCore;
  ...
  Core := TCore.Create();

3. Через ядро движка идет поток сообщений от подсистем (например ввода) и не только. Чтобы иметь возможность обрабатывать эти сообщения, необходимо перенаправить поток сообщений в свой обработчик. Для этого объявляется следующий метод (не просто процедура!) в каком-либо классе приложения:

procedure HandleMessage(const Msg: TMessage);

А затем перенаправляется поток сообщений на него:

Core.MessageHandler := HandleMessage;

4. Ядро движка должно получать некоторые сообщения от ОС. Поэтому, следует направить поток сообщений ОС через движок. Для этого, с помощью функции OSUtils.WMToMessage() преобразовываем сообщение к объектному виду и передаем его в обработчик Core.HandleMessage(). В обработчик приложения, куда мы перенаправили сообщения от ядра несколькими строками выше, также будут приходить сообщения ОС.

Объект Starter умеет делать все это автоматически, надо лишь задать в качестве его обработчика сообщений, соответствующий метод ядра:

Starter.MessageHandler := Core.HandleMessage;

5. Далее, можно создавать визуализатор:

Core.Renderer := TDX8Renderer.Create(Core);

И устройство визуализации, передавая в первом параметре идентификатор окна:

if not Core.Renderer.CreateDevice(Starter.WindowHandle, 0, RunFullScreen) then begin
<обработать ошибку, если не лень>
end;

6. Если предполагается ввод от пользователя, то нужно создать экземпляр контроллера, который и занимается вопросами ввода:

Core.Input := TOSController.Create(Starter.WindowHandle, Core.HandleMessage);

Контроллер позволяет привязать к событию (или последовательности событий) ввода сообщение. Это значит, что при наступлении данного события привязанное сообщение будет отправлено в переданный контроллеру при создании обработчик (в данном случае Core.HandleMessage).

Core.Input.BindCommand('ESC', TForceQuitMsg); // Bind exit to ESC key

Теперь нажатие клавиши "ESC" будет вызывать Core.HandleMessage() (а также Core.MessageHandler(), если данный обработчик был установлен) с сообщением TForceQuitMsg.

7. Теперь пора загрузить сцену из файла. Сцены загружаются из потока (Basics.TStream), поэтому, сперва надо создать из файла поток:

Stream := TFileStream.Create(Filename);

Важно, чтобы использовались классы потоков движка, т.е. объявленные в модуле Basics, для чего можно использовать префикс модуля при обращении к ним. Теперь можно загрузить сцену:

if not Core.LoadScene(Stream) then begin
<обработать ошибку, если не лень>
end;

В сцене должны быть только объекты классов, либо известных движку по умолчанию, либо зарегистрированных дополнительно. В противном случае они будут загружены как объекты класса TItem, о чем будут сделана запись в журнале. Обычно, при включении модуля с классами объектов в uses, их регистрация происходит автоматически. Т.е. если в сцене присутствует, скажем, ландшафт (стандартный), то в uses следует включить модуль C2Land.

С инициализацией на этом все.

Основной цикл

В основном цикле приложения необходимо производить обработку сообщений ОС. В случае использования класса TAppStarter можно переложить эту функцию на него, вызывая метод Starter.Process(), который вернет False, если приложение нужно завершить.

Для функционирования самого движка, достаточно вызывать из основного цикла метод Core.Process.

Таким образом, основной цикл приложения в простейшем случае выглядит так:

while Starter.Process() do Core.Process();

Обработка сообщений

На шаге 3 инициализации был объявлен метод-обработчик сообщений HandleMessage. В него будут поступать сообщения от движка. Например, так можно обработать сообщения ввода:

procedure HandleMessage(const Msg: TMessage);
begin
  if Msg.ClassType = TForceQuitMsg then
    Starter.Terminate();
end;

Финализация

Финализация происходит в обратном инициализации порядке.
Для финализации подсистем, необходимо сперва отключить их от ядра. Для этого соответствующим свойствам ядра присваивается nil. С другой стороны, для освобождения подсистемы нужна ссылка на нее, для чего можно использовать промежуточную переменную:

SubSystem := Core.Renderer;
Core.Renderer := nil; // отсоединяем подсистему
FreeAndNil(SubSystem); // освобождаем подсистему
SubSystem := Core.Input;
Core.Input := nil; // отсоединяем подсистему
FreeAndNil(SubSystem); // освобождаем подсистему
<тоже с остальными подсистемами, созданными приложением>

FreeAndNil(Core);

FreeAndNil(Starter);

 

 

Copyright (C) 2006-2011, casteng.com