Scaleform GFx и CryENGINE

Материал из CryWiki Russia

Перейти к: навигация, поиск

Scaleform GFx — внешнее подпрограммное обеспечение позволяющее отображать Flash-элементы на экране (UI, HUD, текстуры в формате Flash, и т. д.).

Flash-файлы должны быть обработаны GFxExporter, прежде чем их использовать в движке. Файлы Scaleform GFx используют в своём название расширение gfx. Далее представлен короткие пример отрисовки основного Flash-элменета в качестве HUD:

Откройте Game.h, найдите m_pBitmapUi и добавьте:

#include "IFlashPlayer.h"
...
IFlashPlayer* m_pFlashPlayer;

IFlashPlayer — интерфейс, дающий вам все возможности контролировать проигрыватель Flash в игровом окне проекции.

Откройте Game.cpp. Добавьте в конструктор инициализацию указателя проигрывателя Flash.

m_pFlashPlayer(NULL)

В функции Init создайте экземпляр проигрывателя Flash из системы.

if(!m_pFlashPlayer)
{
    m_pFlashPlayer = gEnv->pSystem->CreateFlashPlayerInstance();
    bool bRes = m_pFlashPlayer->Load("Libs\\UI\\Menus_FindGame.swf");
    CryLogAlways("Loading Libs\\UI\\Menus_FindGame.swf: %s",(bRes)?"Done":"Error");
    m_pFlashPlayer->SetViewport(0,0,m_pFlashPlayer->GetWidth(), m_pFlashPlayer->GetHeight(), 1);
}

Экземпляр проигрывателя Flash создал CrySystem. Вы можете получить доступ к CrySystem через глобальную переменную gEnv.

Вы можете отобразить Flash-файл в функции PostUpdate.

if(m_pFlashPlayer != NULL)
{
    m_pFlashPlayer->Advance(fDeltaTime);
    m_pFlashPlayer->Render();
}

Advance синхронизирует игру с Flash-файлами. С помощью Advance вы можете отображать анимированные Flash-файлы.

Доступны различные консольные команды, позволяющие контролировать среду Flash:

sys_flash
Включает/отключает отображение Flash.
sys_flash_info
Включает профилирование Flash, и отображение различной информации.
sys_flash_log_options
Включает отслеживание некоторых, связанных с Flash, аспектов (загрузка Flash, выполнение ActionScript, и т. д.).

Вызов ActionScript в Lua

Вызов в ActionScript:

fscommand("MyCommand")

Может быть перехвачен в C++ с помощью FSCommandHandler (интерфейс IFSCommandHandler). Таким образом, если у вас есть свой ​​собственный класс (например, HUD Manager), который загружает Flash-файлы, то вы должны его зарегистрировать как FSCommandHandler для Flash-команд через указатель IFlashPlayer:

pFlashPlayer->SetFSCommandHandler(this);

(конечно, вы можете использовать более чем один перехватчик команд, к примеру, один для меню и один для HUD)

После этого, вы сможете вызывать все ваши команды из Flash через метод вашего класса, основанного на интерфейсе IFSCommandHandler:

void MyHUDManager::HandleFSCommand( const char *szCommand,const char *strArgs, void* pUserData )
{
   if(!strcmp(szCommand, "MyCommand"))
   {
       CryLogAlways("Flash command received...");
   }
}

Если вы получили Flash-команды, все, что вам нужно сделать, это вызвать метод из Lua-скрипта (взгляните на файл ScriptHelpers.h или же напрямую используйте сам ScriptSystem (gEnv->pScriptSystem)).

Для иного его использования, необходимо реализовать ScriptBind для (например) класса HUD Manager для того, чтобы Lua мог взаимодействовать с С++ (взгляните на файлы ScriptBind_Game.h и ScriptBind_Game.cpp). В пределах этих методов ScriptBind, вы можете просто вызвать метод Flash через указатель IFlashPlayer:

pFlashPlayer->Invoke0("flashMethod"); // 0 аргументов