Создание Flash HUD
Материал из CryWiki Russia
Alex626 (Обсуждение | вклад) (Новая страница: «= Flash HUD Creation = CryENGINE supports Scaleform GFx to load and render Flash assets within a game. To load a flash file follow the [http://freesdk.crydev.net/d...») |
DCamer (Обсуждение | вклад) |
||
(6 промежуточных версий не показаны.) | |||
Строка 1: | Строка 1: | ||
- | = Flash HUD | + | = Создание Flash HUD = |
- | CryENGINE | + | CryENGINE поддерживает Scaleform GFx, чтобы загружать и обрабатывать элементы Flash внутри игры. |
- | + | Чтобы загружать flash файлы, следуйте указаниям в статье [[Scaleform GFx и CryENGINE]]. | |
- | == | + | == Вызов функции Flash == |
- | + | Для того, чтобы это сделать, создайте глобальную функцию в вашем flash-файле: | |
{{Код|заголовок=ActionScript|блок=<source lang="actionscript"> | {{Код|заголовок=ActionScript|блок=<source lang="actionscript"> | ||
setHealth = function(_intHitpointsPercent) | setHealth = function(_intHitpointsPercent) | ||
{ | { | ||
- | // | + | // установить текст в поле динамического текста (не забудьте внедрить шрифты или набор символов) |
txtHealth.text = "Health: " + _intHitpointsPercent.toString(); | txtHealth.text = "Health: " + _intHitpointsPercent.toString(); | ||
} | } | ||
</source>}} | </source>}} | ||
- | + | и вызовите следующую функцию в вашем С++ коде: | |
Строка 30: | Строка 30: | ||
</source>}} | </source>}} | ||
- | + | Существует 3 функции вызова, которые позволяют инициировать методы flash: | |
{{Код|заголовок=C++|блок=<source lang="cpp"> | {{Код|заголовок=C++|блок=<source lang="cpp"> | ||
- | pFlashPlayer->Invoke0( "flashFunction" ); // 0 | + | pFlashPlayer->Invoke0( "flashFunction" ); // 0 аргументов |
- | pFlashPlayer->Invoke1( "flashFunction", arg1 ); // 1 | + | pFlashPlayer->Invoke1( "flashFunction", arg1 ); // 1 аргумент |
SFlashVarValue args[3] = { arg1, arg2 , arg3 }; | SFlashVarValue args[3] = { arg1, arg2 , arg3 }; | ||
- | m_pFlashPlayer->Invoke( "setPlayerPos" , args , 3 ); // 2 | + | m_pFlashPlayer->Invoke( "setPlayerPos" , args , 3 ); // 2 или больше аргументов |
</source>}} | </source>}} | ||
- | == | + | == Загрузка мини-карты == |
- | + | Редактор Sandbox имеет функционал для генерации миникарты вашего уровня. Больше информации можно найти в статье [http://freesdk.crydev.net/display/SDKDOC2/Creating+Mini+Maps Creating Mini Maps]. | |
- | + | После того, как вы создали .dds и .xml файлы с вашего уровня, вы можете легко загрузить файл миникарты .dds в ваш HUD. | |
- | + | Вам нужно будет создать функцию внутри Flash файла, которая загружает файл с данным именем в MovieClip: | |
{{Код|заголовок=ActionScript|блок=<source lang="actionscript"> | {{Код|заголовок=ActionScript|блок=<source lang="actionscript"> | ||
setMiniMap = function(_strPathToMiniMap) | setMiniMap = function(_strPathToMiniMap) | ||
{ | { | ||
- | //_strPathToMiniMap: scaleform | + | //_strPathToMiniMap: scaleform-совместимый путь к изображению карты, должен быть в формате .dds |
loadMovie("img://"+ _strPathToMiniMap, MiniMapMC); | loadMovie("img://"+ _strPathToMiniMap, MiniMapMC); | ||
} | } | ||
</source>}} | </source>}} | ||
- | + | теперь вы можете ызвать эту функцию из С++ | |
Строка 65: | Строка 65: | ||
- | + | Возможно, вы захотите отображать на карте некоторые динамические элементы, к примеру, позицию игрока. | |
- | + | ||
- | + | ||
+ | Чтобы это сделать, вам придётся считывать .xml файл, который создал редактор Sandbox, чтобы получить начальные и конечные координаты мини-карты. | ||
{{Код|заголовок=C++|блок=<source lang="cpp"> | {{Код|заголовок=C++|блок=<source lang="cpp"> | ||
Строка 95: | Строка 94: | ||
float mapDimX = mapEndX - mapStartX; | float mapDimX = mapEndX - mapStartX; | ||
float mapDimY = mapEndY - mapStartY; | float mapDimY = mapEndY - mapStartY; | ||
- | // | + | // Примечение: вы также можете проверять измерения на равенство 0! |
</source>}} | </source>}} | ||
- | + | Теперь просто задайте значения позиции от 0 до 1, и отошлите их в Flash: | |
Строка 108: | Строка 107: | ||
float posx = (pos.x - mapStartX) / mapDimX; // value from 0 to 1 | float posx = (pos.x - mapStartX) / mapDimX; // value from 0 to 1 | ||
float posy = (pos.y - mapStartY) / mapDimY; | float posy = (pos.y - mapStartY) / mapDimY; | ||
- | SFlashVarValue args[3] = { posx, posy , pActor->GetAngles().z *180.0f/gf_PI-90.0f}; // | + | SFlashVarValue args[3] = { posx, posy , pActor->GetAngles().z *180.0f/gf_PI-90.0f}; // обратите внимание, что миникарта повёрнута на -90 градусов |
m_pFlashPlayer->Invoke("setPlayerPos", args, 3); | m_pFlashPlayer->Invoke("setPlayerPos", args, 3); | ||
} | } | ||
</source>}} | </source>}} | ||
- | + | На стороне Flash вы можете реализовать функцию, которая устанавливает на карте позицию и угол поворота клипа, который представляет положение игрока на миникарте: | |
{{Код|заголовок=ActionScript|блок=<source lang="actionscript"> | {{Код|заголовок=ActionScript|блок=<source lang="actionscript"> | ||
setPlayerPos = function(_floatPosx, _floatPosy, _intRot) | setPlayerPos = function(_floatPosx, _floatPosy, _intRot) | ||
{ | { | ||
- | // | + | // созданный .dds файл миникарты имеет разрешение 512*512 |
- | var pX = _floatPosy * 512; // | + | var pX = _floatPosy * 512; // т.к. карта повёрнута на -90 градусов, поменяем координаты x и y местами |
var pY = _floatPosx * 512; | var pY = _floatPosx * 512; | ||
Строка 128: | Строка 127: | ||
} | } | ||
</source>}} | </source>}} | ||
+ | |||
+ | [[Категория:CryEngine_3_Free_SDK:Пользовательский_интерфейс]] |
Текущая версия на 16:08, 9 марта 2012
Создание Flash HUD
CryENGINE поддерживает Scaleform GFx, чтобы загружать и обрабатывать элементы Flash внутри игры.
Чтобы загружать flash файлы, следуйте указаниям в статье Scaleform GFx и CryENGINE.
Вызов функции Flash
Для того, чтобы это сделать, создайте глобальную функцию в вашем flash-файле:
setHealth = function(_intHitpointsPercent) { // установить текст в поле динамического текста (не забудьте внедрить шрифты или набор символов) txtHealth.text = "Health: " + _intHitpointsPercent.toString(); }
и вызовите следующую функцию в вашем С++ коде:
CActor *pActor = static_cast<CActor *>(gEnv->pGame->GetIGameFramework()->GetClientActor()); if (pActor != NULL) { int health = pActor->GetHealth(); pFlashPlayer->Invoke1("setHealth", health); }
Существует 3 функции вызова, которые позволяют инициировать методы flash:
pFlashPlayer->Invoke0( "flashFunction" ); // 0 аргументов pFlashPlayer->Invoke1( "flashFunction", arg1 ); // 1 аргумент SFlashVarValue args[3] = { arg1, arg2 , arg3 }; m_pFlashPlayer->Invoke( "setPlayerPos" , args , 3 ); // 2 или больше аргументов
Загрузка мини-карты
Редактор Sandbox имеет функционал для генерации миникарты вашего уровня. Больше информации можно найти в статье Creating Mini Maps.
После того, как вы создали .dds и .xml файлы с вашего уровня, вы можете легко загрузить файл миникарты .dds в ваш HUD.
Вам нужно будет создать функцию внутри Flash файла, которая загружает файл с данным именем в MovieClip:
setMiniMap = function(_strPathToMiniMap) { //_strPathToMiniMap: scaleform-совместимый путь к изображению карты, должен быть в формате .dds loadMovie("img://"+ _strPathToMiniMap, MiniMapMC); }
теперь вы можете ызвать эту функцию из С++
pFlashPlayer->Invoke1("setMiniMap", "Levels\\PacificIsland\\PacificIsland.dds");
Возможно, вы захотите отображать на карте некоторые динамические элементы, к примеру, позицию игрока.
Чтобы это сделать, вам придётся считывать .xml файл, который создал редактор Sandbox, чтобы получить начальные и конечные координаты мини-карты.
float mapStartX = 0; float mapStartY = 0; float mapEndX = 1; float mapEndY = 1; IXmlParser* pxml = gEnv->pGame->GetIGameFramework()->GetISystem()->GetXmlUtils()->CreateXmlParser(); if(pxml != NULL) { XmlNodeRef node = GetISystem()->LoadXmlFile("Levels\\PacificIsland\\PacificIsland.xml"); if (node != NULL) { node = node->findChild("Minimap"); if (node) { node->getAttr("startX", mapStartX); node->getAttr("startY", mapStartY); node->getAttr("endX", mapEndX); node->getAttr("endY", mapEndY); } } } float mapDimX = mapEndX - mapStartX; float mapDimY = mapEndY - mapStartY; // Примечение: вы также можете проверять измерения на равенство 0!
Теперь просто задайте значения позиции от 0 до 1, и отошлите их в Flash:
CActor *pActor = static_cast<CActor *>(gEnv->pGame->GetIGameFramework()->GetClientActor()); if (pActor != NULL && pActor->GetEntity() != NULL) { Vec3 pos = pActor->GetEntity()->GetWorldPos(); float posx = (pos.x - mapStartX) / mapDimX; // value from 0 to 1 float posy = (pos.y - mapStartY) / mapDimY; SFlashVarValue args[3] = { posx, posy , pActor->GetAngles().z *180.0f/gf_PI-90.0f}; // обратите внимание, что миникарта повёрнута на -90 градусов m_pFlashPlayer->Invoke("setPlayerPos", args, 3); }
На стороне Flash вы можете реализовать функцию, которая устанавливает на карте позицию и угол поворота клипа, который представляет положение игрока на миникарте:
setPlayerPos = function(_floatPosx, _floatPosy, _intRot) { // созданный .dds файл миникарты имеет разрешение 512*512 var pX = _floatPosy * 512; // т.к. карта повёрнута на -90 градусов, поменяем координаты x и y местами var pY = _floatPosx * 512; PlayerPosMC._x = pX; PlayerPosMC._y = pY; PlayerPosMC._rotation = -_intRot; }