Изучение CrystalSpace game engine


СтатьиФорумИнфо

Блог

5 мар 2011

CS – это рабочая база с модульной концепцией. Из-за этого он кажется переутяжелённым по сравнению с другими движками. Взамен, такая структура (подключаемые модули-plug-in’ы) предоставляет широкую сферу применения, и место для полёта фантазии игродельца. В этой главе разрабы попытаются дать нам понять философию их детища. Здесь нет какого-либо кода, весь текст лишь для того, что бы немного «въехать» в суть работы движка.

CS в собранном виде представляет собой набор разнообразных компонентов и библиотек для создания игр. Хотя по большей части двиг заточен под 3Д, такие его части как VFS (Virtual File System) –plug-in или звуковой драйвер ((ага, глючный OpenAL)), Вы можете спокойно воткнуть куда угодно. То есть компоненты как бы не зависят друг от друга – это выдается за главную фичу движка. Например, если Вам не нужна модная физика или скрипты, то можно вообще забыть про соответсвующие plug-in’ы. Все компоненты движка разработаны так, чтобы требовать лишь минимально необходимые для своей работы другие plug-in’ы. Например 3Д движок требует 3Д рендерер, а 3Д рендереру нужнен 2Д фрейм, чтобы туда писать картинку, его предоставляет plug-in canvas. С другой стороны, для 3Д рендеринга 3Д движок вовсе необязателен.

Несмотря на малую зависимоть модулей друг от друга, они легко интегрируются.

Еслы Вы все еще не расхотели создавать свои замечательные проэкты на CS, зарубите себе на носу: CS  - это не какая-то одна монолитная библиотека, это – несколько модулей. Модулями разрабы называют plug-in’ы вкупе с библиотеками, не находя между ними принципиального различия

Для использования plug-in может быть организован в виде динамической или статической библиотеки. Все plug-in’ы подключаются похожим способом (как именно - далее), имеют унитарный интерфейс, и сохраняют его, будучи собранными в библиотеку. Главное отличие plug-in’а от обычной библиотеки – plug-in использует как интерфейс только SCF (Shared Class Facility), а библиотеки и SCF, и обычные классы CPP.

Plug-in’ы можно создавать самому, ознакомившись с тем, как их сделать совместимыми через SCF с остальным движком.

Про SCF:

Главный объект SCF – это интерфейс, т. е. способ без заморочек отделить описание public методов объекта от текста программы, где они реализуются. На выходе получается, что через SCF мы будем иметь только указатель на абстрактный класс (без реальной имплементации), который содержит только «виртуальные»(не virtual) методы. Эта байда пишется в хэдере. Такой объект будет т. н. имплементацией интерфейса. Используя движок, вы будете, вызывать функции, которые  создавают реальные объекты, а возвращают только этот «указательный» объект-интерфейс. Это очень лаконично, удобно и экономично. Раньше, пока разработчики еще не написали свой смарт-пойнтер <CSref>, для передачи ссылки использовался метод IncRef(), для удаления – DecRef(). К выходу CS 2.0 и вовсе обещают отказаться от этих команд, так что их использование нежелательно.
Вообще, CS широко использует [url= http://ru.wikipedia.org/wiki/%D0%A4%D0%B0%D0%B1%D1%80%D0%B8%D1%87… 0%B8%D1%8F%29]фабричный метод.[/url]

Подключение plug-inа:

Выполните все следующие действия сперва для тех plug-inов, от которых зависит подключаемый.

  • Зарегистрируйте библиотеку с plug-inом.
  • Загрузите plug-in, там самым проинициализировав его.
  • Создайте запрос (query) к интерфейсу plug-inа (это будет SCF-интерфейс)

Теперь подробнее.

Регистрация (register) plug-in’а.

Если plug-in – статичная библиотека(static library):

SCF_REGISTER_STATIC_CLASS(
  cxx-class,
  scf-name,
  description,
  dependencies)

Где:
cxx-class – имя класса-создателя(factory), то же самое имя передается макросу SCF_IMPLEMENT_FACTORY()
scf-name – имя создаваемого объекта
description – комментарий, строка
dependencies –  SCF объекты других plug-inов, от которых зависит данный plug-in, через запятую

DLL-plug-in регистрируется автоматически по своим метаданным при загрузке.

Загрузка (load) plug-in’а.

Для этого CS предоставляет нам plug-in loader. Это - объект, позволяющий загружать plug-inы по данным / аргументам) из config-файла / командной строки или как- либо еще. Кроме того, он способен зарегистрировать (с помощью другого объекта, plug-in manager) наш plug-in в Object Registry.

Что такое Object Registry? Это «книга регистрации в церкви на цетральной площади деревни, называющейся CrystalSpace»: сюда любой модуль (plug-in loader в том числе) вписывает SCF-объекты, давая им имя-тэг. По умолчанию, объекту будет приписано имя, идентичное названию интерфейса. Например, 3D renderer – plug-in, регистрирующий, среди других, интерфейс iGraphics3D. Однако в память можно загрузить одновременно несколько 3Д – рендереров с разными именами-тэгами (например, для процедурного текстурирования). Но дефолтный 3Д – рендерер будет зарегистрирован как iGraphics3D.

Вернёмся к загрузке плгаина. Итак, есть 3 способа:

  • Вручную, функцией csLoadPlugin – не рекомендуется к использованию
  • С помощью plug-in loader (csPluginLoader.).
  • Через класс - csInitializer()

Plug-in loader. Принимаемые аргументы имеют следующий приоритет:

  • Наивысший, у аргументов из командной строки (sys.argv).
  • Средний, у данных из config – файла.
  • Низший – у данных из кода (играют роль аргументов по умолчанию).

csPluginLoader::csPluginLoader (iObjectRegistry* object_reg); /*инициализация*/
void csPluginLoader::RequestPlugin (const char *pluginName, const char *tagName); /*что будем грузить, какое имя-тэг дадим в Object Registry*/
bool csPluginLoader::LoadPlugins (); /*собственно, грузим plug-inы*/
virtual csPluginLoader::~csPluginLoader();/*удоление*/

Класс - csInitializer(), среди прочего также и загружающий plug-inы функцией RequestPlugins():

#include <crystalspace.h>

class Simple : public csApplicationFramework

{
public:
  Simple ();
  ~Simple ();
  bool OnInitialize (int argc, char* argv[]);

};

bool Simple::OnInitialize(int argc, char* argv[])
{
  if (!csInitializer::RequestPlugins(GetObjectRegistry(),
    CS_REQUEST_VFS,
    CS_REQUEST_OPENGL3D,
    CS_REQUEST_ENGINE,
    )) return ReportError("Failed to initialize plugins!");

  return true;
}
//это часть примера, который целиком будет рассмотрен позже

Создание запроса (query) к интерфейсу plug-in’а.

Любой объект (в том числе и plug-in) находится в Object Registry со своим именем-тэгом, и достпен по нему. Как, например, плагин Script:

//запрос по дефолтному имени
csQueryRegistry<iScript>(object_reg)
//или, для запроса по альтернативному имени:
csQueryRegistryTag<iScript_02>(object_reg)

Та же байда, в Питоне:

>>> import sys
>>> from cspace import *
>>> object_reg = csInitializer.CreateEnvironment(sys.argv)
>>> plugin_mgr = object_reg.Get(iPluginManager)
>>> script = CS_LOAD_PLUGIN(plugin_mgr, "crystalspace.script.python", iScript) #да, рекурсия
>>> type(plugin_mgr)
<class 'cspace.core.iPluginManager'>
>>> type(script)
<class 'cspace.ivaria.iScript'>
>>>

Этот код создаст объект cspace.core.iObjectRegistry с именем object_reg и минимальное окружение: часы, 3Д движок, загрузчик изображений, plug-in loader и т. д… Все эти объекты (а точнее, их SCF-интерфейсы) будут вписаны в object_reg. Уже оттуда мы «вытаскиваем»( .Get) plug-in loader по его дефолтному имени-тэгу чтобы использовать дальше.

Ссылка

5 мар 2011

Итак, Вы решили «пощупать» движок CrystalSpace.


Здесь я опишу, как скачать, правильно скомпилировать движок для работы с Python 2.6 в WinXP, а позже немного пробегусь по принципу устройства движка и назначению отдельных частей.

CrystalSpace (далее - CS) поставляется разработчиками в 2-х версиях: как бы стабильная 1.4 и находящаяся в разработке 1.9. Она нам и нужна, так как лучше совмещается с Python.
Версию 1.4 можно скачать с офсайта одним архивом, но ее не рекомендуют даже разработчики.

Понадобится программа для работы с репозиториями, например, RapidSvn.
В ней жмете Ctrl-O, вводите URL https://crystal.svn.sourceforge.net/svnroot/crystal/CS/trunk  и целевой каталог на локальном компьютере, я рекомендую [диск]:\Program Files\CS. На данный момент (05.03.11) исходники и прочий контент имеют объем около 2Гб.

Теперь, нужно скачать компилятор для CPP, на коем и написан движок. Я рекомендую Microsoft Visual C++ 2008 Express Edition с офсайта майкрософт (далее - MSVC), и все действия будут описаны именно для этой программы.

Следующий шаг – получение пакета стандартных библиотек для платформы Win: http://www.crystalspace3d.org/downloads/cs-winlibs/
Выбираем самую свежую версию, сейчас это cs-winlibs-x64-1.9_008.exe. Программа представляет собой инсталлятор, предлагающий в указанную папку установить некий минимальный набор библиотек, необходимых для работы движка, и плюс копирует их в папку CrystalSpace. Также она автоматически устанавливает их поддержку для других сторонних программ (в том чилсе и нашего MSVC). Для экономии места можно оставить поддержку только MSVC. Также устанавливает OpenAL.

Насчет Python 2.6: у меня он лежит (как и по стандарту): в [диск]:\Python26 Из site-packages установлены PIL с aggdraw (последняя версая все так же забагована и не рисует кривые Безье) и PyCEGUI  (CS при проверке наличия pycegui ее не признает и требует какую-то лохматую версию, которой уж и не найти). Эти и кучу других 3rd party packages можно найти на http://pypi.python.org/pypi/

Для желающих Творить

.
  • Первый вариант, бета-Blender + бета-экспортер в формат CS. Скачиваем Blender 2.56 beta.
    Вытягиваем RapidSvn’ом https://cyanox.nl/peragro/branches/b2.5cs/ в удобную директорию (у меня это C:/files/soft/b25toCS/) скрипты для экспорта контента в формат CS  (XML world file, возможно, об этом подробнее позже). В удобном месте создаем текстовый файл exec.txt с нижеследующим содержанием:
    import sys, os
    sys.path.append("C:/files/soft/b25toCS/scripts/io")
    import b2cs

    В строке "C:/files/soft/b25toCS/scripts/io" указываете свой путь к b25toCS, и не забывайте куда у Вас смотрят слэши.
    Далее, ваяете необходимй арт, или, что проще - дорабатываете до удобоваримости экспортером тысячи имеющегося в Сети контента. Как наваяли необходимое – в окне Text открываем наш файл, Run Script. Если не работает без видимых причин– еще раз Run Script.

  • Второй вариант. Для Blender 2.49 на Python 2.5  (это важно, не 2.6, а именно 2.5) есть скрипт blender2crystal с замечетельным пользовательским интерфейсом. Стягиваем его отсюда: http://leapingcat.org/blender2crystal/index.php/Main_Page
    Там же – вся документация, бат ю маст кен ту инглиш.

Да, конечно же, все это великолепие не заработает должным образом, пока Вы не скомпилируете CS.

Cборка.


Сперва необходимо установить глобальные переменные через Мой компьютер > Свойства > Дополнительно > Переменные среды > Переменные пользователя
Создаете следующие переменные:
  • CRYSTAL=[диск]:\Program Files\CS
  • CEL=[диск]:\Program Files\CEL (если есть и CEL)
  • PYTHON_INCLUDE=[диск]:\Python26\include
  • PYTHON_LIB=[диск]:\Python26\libs\python26.lib
  • PYTHONPATH=%CRYSTAL%;%CEL%;%CEL%\scripts;%CRYSTAL%\scripts\python\frozen;C:\Python26

    • Возможно, с последней переменной я перемудрил, но как-то не было времени проверить, действительно ли нужны все эти директории. Если есть желание - проверьте, какие можно убрать.

    Теперь открываете MSVC. Обновление, ждите. Открываете Сервис > Параметры > Проэкты и решения (в левой части окна, прокрутить вверх) > Каталоги VC++. Сначала из выплывающего списка вверху справа выбираете показать каталоги для: включаемые файлы, после чего > Создать строку, туда вписываете:
    [диск]:\Python26\include
    Теперь Файлы библиотек > Создать строку, пишете:
    [диск]:\Python26\libs

    Теперь Файл > Открыть Решение или проект > /CS/mk/msvc9/wkspytypical.sln Заметьте, wksPYtypical. Это стандартная сборка плюс несколько дополнительных библиотек, необходимых для совместимости с Питоном.
    Теперь в Построение Диспетчер конфигураций выбираем нужную конфигурацию сборки, например release with DLLs. Какие-то туториалы по CS советуют собрать во всех возможных конфигурациях (~12 Гб дискового пространства), но нам этого не нужно.

    Всё, можно жамкать заветную кнопку. Могут быть ошибки при построении, естественно, так как мы скачали bleeding-edge версию.

    Теперь можно заходить в корневую директорию свежесобранного CS. Там появится несколько программ, папка out/release9/… , в ней- libs с заветным libcrystalcpace.lib
    Можете побаловаться с приложением startme.exe, walktest.exe и др. в корневом каталоге CS. Если никогда раньше не видели PlaneShift, то теперь сможете убедиться, насколько движок тормознутый как хорошо движок оптимизирован.
    В оф. туториале Walktest’у посвящен целый раздел, но я на нем подробно останавливаться не буду. Скажу лишь только, что если в скрипте экспорта из Blender’а жать Export+Run, то созданный из Вашей Blender-сцены скриптом xml-файл подгрузится именно в walktest.

Ссылка

5 мар 2011

  • Официальный сайт движка CrystalSpace (англ.)
  • Wiki проекта Peragro Tempus (англ.)
    Там же Вы найдете несколько полезных утилит для работы с контентом CrystalSpace.
  • Wiki, посвященная утилите blender2crystal (англ.)
    Blender2Crystal - мощная утилита с удобным GUI, позволяющая экспортировать сцену из Blender в формат XML world file, используемый CrystalSpace для создания мешей, материалов, анимации и т. д. Также позволяет использовать функциональные возможности CEL - Crystal Entity Layer для создания игр прямо в Blender.
  • Сайт проекта PlaneShift (англ.)
    Проект использует игровой движок CrystalSpace

Ссылка