Войти
Playground SDKСтатьи

Начало - установка и инициализация

Часть первая, в которой мы загружаем и устанавливаем SDK инициализируем все и создаем примитивное окно.

Загрузка и установка
В первую очередь нам необходимо заполучить наш фреймворк. Для этого идем на сайт https://developer.playfirst.com/, регестрируемя там и скачиваем последнюю версию. Он доступен под две основные казуальные платформы – Windows и Mac. Дел с Mac-версией я не имел, но, насколько я понимаю, если все делать по инструкции, приведенной на сайте (https://developer.playfirst.com/guidelines) то проблем с портированием быть не должно.
Версия под Windows требует VS2005, достатончо Express-версии. Под другими не работает. Поэтому если у вас до сих пор её нет – немедленно исправляйте это недоразумение.
Ставим фреймворк куда нибудь, создаем проект, прописываем инклюды и либы. Так-же обеспечиваем так, чтобы в той папке, куда будут ложиться исполняемые файлы была папка assets (там лежат все ресурсы) и был на расстоянии доступности pflibDebug.dll – отладочная версия движка.
В дебаге нам нужно линковать только с pflibDebug.lib, в релизе – с кучей библиотек для статической версии (shfolder.lib unicows.lib iphlpapi.lib ogg_static.lib vorbis_static.lib vorbisfile_static.lib WS2_32.lib pflibStatic.lib User32.lib winmm.lib wininet.lib Version.lib ddraw.lib dxguid.lib d3dx.lib dsound.lib odbc32.lib odbccp32.lib ole32.lib shell32.lib Gdi32.lib), и только с pflib.lib для динамической (но тогда надо еще будет таскать с собой pflib.dll о полутора метрах). В случае статической версии – не забываем поставить в Linker->Optimization->Enable COMDAT Folding в /OPT:NOICF – без этого оно падает где-то в Lua.
Так-же не забыть, что у нас должно быть Windows-приложение, не консольное.
Инициализация
Вся работа по инициализации делается движком. Нам нужно в файле, где будет главная функция, указать в начале #define PLAYFIRST_MAIN, подключть “pf/pflib.h”, содержащий всю библиотеку, и сделать функцию void Main(TPlatform *platform, const char * cmdLine).
У нас есть главный класс, TPlatform, управляющий всем глобально. Класс является синглетоном, экземпляр достается через TPlatform::GetInstance(). С помощью функции SetWindowTitle мы можем поставить заголовок окна, с помощью SetDisplay – выставить параметры экрана.
Окна
Движок работает с окнами, которые наследуются от класса TWindow. Создадим хидер/исходникю Подключим <pf/windows.h> (нам совершенно незачем цеплять все в хидере). Унаследуем его от TWindow, укажем в нем где-нибудь PFTYPEDEF_DC(TSampleWindow, TWindow), где TSampleWindow – создаваемый нами класс. Сделаем конструктор и пока пожалуй все. В cpp-файле сделаем PFTYPEIMPL_DC(TSampleWindow). Подробности про местный RTTI будут в один из следующих разов, пока можно просто запомнить/прочитать в документации. В cpp-файле просто сделаем пустой конструктор.
Теперь нам надо зарегистрировать наше окно в движке. Делается это посредством TWindowManager:: AddWindowType. TWindowManager – тоже синглетонный класс. В качестве параметров указываем “SampleWindow” и TSampleWindow::ClassId().
Скрипт
Теперь нам нужно заставить все это крутиться. «Глобальным» управлением ходом игры занимается скрипт на встроенном в движок интерпретаторе Lua. В данный момент нам нужно 2 lua-файла – с главным циклом и с нашим окном. Главный цикл будет постоянно создавать окно, если оно разрушено, но только до тех пор, пока мы не выйдем из игры.

function Main()
    while true do
        DoMainWindow("scripts/sample.lua");
    end
end

return Main
В sample.lua мы положим скрипт, создающий наше окно:
MakeDialog
{
    SampleWindow
    {
        x = 0, y = 0, w = горизонтальное-разрешение, h = вертикальное-разрешение,
    },
}
Нельзя забывать, что скрипты полагается ложить в папку, которая-бы лежала в папке assets, причем последняя должна быть там, где будет exe-файл. По идее, все скрипты ложатся в assets/scripts, но вы можете куда нибудь еще, но не забывайте, что надо будет поменять соответственно пути в скрипте. Все пути задаются относительно assets/.
Главный цикл
Теперь переходим к главному циклу. Мы должны запустить скрипт с главным циклом (выполняется параллельно) и начать гонять сообщения. Скрипт запускается банальным GetScript()->RunScript("scripts/mainloop.lua"), функция GetScript() лежит в TWindowManager.
Теперь гоняем сообщения. У нас есть класс TEvent, мы делаем бесконечный цикл, на каждом такте которого выполняем TPlatform::GetEvent, после чего разбираем, что за сообщение нам пришло. В главном цикле достаточно обрабатывать события, связанные с выходом. Это TEvent::kQuit и TEvent::kClose, на оба реакция должна быть одинакова – return.
Итого
Самая сложная часть, с которой лично мне в одно время пришлось много провозиться (я не копипастил из сэмпла, а писал сам, пытаясь разобраться, как работает) позади. В следующий раз попробуем что-нибудь в нашем окне нарисовать.
Сэмплы кода выкладывать не буду, а так-же на вопросы типа «как поменять место, куда будет ложиться exe-файл» отвечать не буду – считаю, что это должно быть известно по умолчанию.
На другие вопросы – постараюсь ответить.

#Lua, #tplatform, #twindow, #twindowmanager

1 ноября 2007

Комментарии [14]