Создание Flash HUD

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

(Различия между версиями)
Перейти к: навигация, поиск
Строка 1: Строка 1:
{{в процессе перевода|дата=9 марта 2012}}
{{в процессе перевода|дата=9 марта 2012}}
-
= Flash HUD Creation =
+
= Создание Flash HUD =
-
CryENGINE supports Scaleform GFx to load and render Flash assets within a game.
+
CryENGINE поддерживает Scaleform GFx, чтобы загружать и обрабатывать элементы Flash внутри игры.
-
To load a flash file follow the [http://freesdk.crydev.net/display/SDKDOC4/Scaleform+GFx+and+CryENGINE Scaleform GFx and CryENGINE] document.
+
Чтобы загружать flash файлы, следуйте указаниям в статье [http://freesdk.crydev.net/display/SDKDOC4/Scaleform+GFx+and+CryENGINE Scaleform GFx and CryENGINE].
-
== Calling a Flash function ==
+
== Вызов функции Flash ==
-
In order to do this you have to write a global function in your Flash file:
+
Для того, чтобы это сделать, создайте глобальную функцию в вашем flash-файле:
{{Код|заголовок=ActionScript|блок=<source lang="actionscript">
{{Код|заголовок=ActionScript|блок=<source lang="actionscript">
setHealth = function(_intHitpointsPercent)
setHealth = function(_intHitpointsPercent)
{
{
-
     // set text of a dynamic text box (don't forget to embed the charackter set)
+
     // установить текст в поле динамического текста (не забудьте внедрить шрифты или набор символов)
     txtHealth.text = "Health: " + _intHitpointsPercent.toString();
     txtHealth.text = "Health: " + _intHitpointsPercent.toString();
}
}
</source>}}
</source>}}
-
and call this function within your c++ code:
+
и вызовите следующую функцию в вашем С++ коде:
Строка 32: Строка 32:
</source>}}
</source>}}
-
There are three Invoke functions that allow you to call flash functions:
+
Существует 3 функции вызова, которые позволяют инициировать методы flash:
{{Код|заголовок=C++|блок=<source lang="cpp">
{{Код|заголовок=C++|блок=<source lang="cpp">
-
pFlashPlayer->Invoke0( "flashFunction" ); // 0 arguments
+
pFlashPlayer->Invoke0( "flashFunction" ); // 0 аргументов
-
pFlashPlayer->Invoke1( "flashFunction", arg1 ); // 1 arguments
+
pFlashPlayer->Invoke1( "flashFunction", arg1 ); // 1 аргумент
   
   
SFlashVarValue args[3] = { arg1, arg2 , arg3 };
SFlashVarValue args[3] = { arg1, arg2 , arg3 };
-
m_pFlashPlayer->Invoke( "setPlayerPos" , args , 3 ); // 2 or more arguments
+
m_pFlashPlayer->Invoke( "setPlayerPos" , args , 3 ); // 2 или больше аргументов
</source>}}
</source>}}
-
== Loading a Minimap ==
+
== Загрузка мини-карты ==
-
The Sandbox Editor has a function to create a minimap for your level. More information can be found in the [http://freesdk.crydev.net/display/SDKDOC2/Creating+Mini+Maps Creating Mini Maps] tutorial.
+
Редактор Sandbox имеет функционал для генерации миникарты вашего уровня. Больше информации можно найти в статье [http://freesdk.crydev.net/display/SDKDOC2/Creating+Mini+Maps Creating Mini Maps].
-
After you have created the .dds and .xml files of your level, you can easily load this .dds file into your flash hud.
+
После того, как вы создали .dds и .xml файлы с вашего уровня, вы можете легко загрузить файл миникарты .dds в ваш HUD.
-
You have to create a function in your Flash file that loads a file by a given filename into a MovieClip:
+
Вам нужно будет создать функцию внутри Flash файла, которая загружает файл с данным именем в MovieClip:
{{Код|заголовок=ActionScript|блок=<source lang="actionscript">
{{Код|заголовок=ActionScript|блок=<source lang="actionscript">
setMiniMap = function(_strPathToMiniMap)
setMiniMap = function(_strPathToMiniMap)
{
{
-
     //_strPathToMiniMap:    scaleform compatible path to the background map image, should be .dds
+
     //_strPathToMiniMap:    scaleform-совместимый путь к изображению карты, должен быть в формате .dds
     loadMovie("img://"+ _strPathToMiniMap, MiniMapMC);
     loadMovie("img://"+ _strPathToMiniMap, MiniMapMC);
}
}
</source>}}
</source>}}
-
now you can call this function by c++
+
теперь вы можете ызвать эту функцию из С++
Строка 67: Строка 67:
-
You may want to show some dynamic items on the minimap, player position, for example.
+
Возможно, вы захотите отображать на карте некоторые динамические элементы, к примеру, позицию игрока.
-
 
+
-
To do this you have to read the .xml file that is created by the Sandbox Editor to get the start and end values of the minimap.
+
 +
Чтобы это сделать, вам придётся считывать .xml файл, который создал редактор Sandbox, чтобы получить начальные и конечные координаты мини-карты.
{{Код|заголовок=C++|блок=<source lang="cpp">
{{Код|заголовок=C++|блок=<source lang="cpp">
Строка 97: Строка 96:
float mapDimX = mapEndX - mapStartX;
float mapDimX = mapEndX - mapStartX;
float mapDimY = mapEndY - mapStartY;
float mapDimY = mapEndY - mapStartY;
-
// Note: you may check if the dimensions are not 0!
+
// Примечение: вы также можете проверять измерения на равенство 0!
</source>}}
</source>}}
-
Now you can simply create position values between 0 and 1 and send them to Flash:
+
Теперь просто задайте значения позиции от 0 до 1, и отошлите их в Flash:
Строка 110: Строка 109:
     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}; // note that the minimap is rotated by -90 degree
+
     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>}}
-
On the Flash side you can implement a function that sets position and rotation of a MovieClip that represents the player position on the minimap:
+
На стороне Flash вы можете реализовать функцию, которая устанавливает на карте позицию и угол поворота клипа, который представляет положение игрока на миникарте:
{{Код|заголовок=ActionScript|блок=<source lang="actionscript">
{{Код|заголовок=ActionScript|блок=<source lang="actionscript">
Строка 121: Строка 120:
{
{
     // the created minimap .dds file has dimensions 512*512
     // the created minimap .dds file has dimensions 512*512
-
     var pX = _floatPosy * 512; // since map is rotated about -90 degree, switch x and y coordiantes
+
     var pX = _floatPosy * 512; // т.к. карта повёрнута на -90 градусов, поменяем координаты x и y местами
     var pY = _floatPosx * 512;
     var pY = _floatPosx * 512;
   
   

Версия 12:26, 9 марта 2012

Эта страница страница помечена как находящиеся в процессе перевода с: 9 марта 2012.


Создание Flash HUD

CryENGINE поддерживает Scaleform GFx, чтобы загружать и обрабатывать элементы Flash внутри игры.

Чтобы загружать flash файлы, следуйте указаниям в статье Scaleform GFx and CryENGINE.

Вызов функции Flash

Для того, чтобы это сделать, создайте глобальную функцию в вашем flash-файле:

ActionScript
setHealth = function(_intHitpointsPercent)
{
    // установить текст в поле динамического текста (не забудьте внедрить шрифты или набор символов)
    txtHealth.text = "Health: " + _intHitpointsPercent.toString();
}


и вызовите следующую функцию в вашем С++ коде:


C++
CActor *pActor = static_cast<CActor *>(gEnv->pGame->GetIGameFramework()->GetClientActor());
if (pActor != NULL)
{
    int health = pActor->GetHealth();
    pFlashPlayer->Invoke1("setHealth", health);
}


Существует 3 функции вызова, которые позволяют инициировать методы flash:


C++
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:

ActionScript
setMiniMap = function(_strPathToMiniMap)
{
    //_strPathToMiniMap:    scaleform-совместимый путь к изображению карты, должен быть в формате .dds
    loadMovie("img://"+ _strPathToMiniMap, MiniMapMC);
}


теперь вы можете ызвать эту функцию из С++


C++
pFlashPlayer->Invoke1("setMiniMap", "Levels\\PacificIsland\\PacificIsland.dds");


Возможно, вы захотите отображать на карте некоторые динамические элементы, к примеру, позицию игрока.

Чтобы это сделать, вам придётся считывать .xml файл, который создал редактор Sandbox, чтобы получить начальные и конечные координаты мини-карты.

C++
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:


C++
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 вы можете реализовать функцию, которая устанавливает на карте позицию и угол поворота клипа, который представляет положение игрока на миникарте:

ActionScript
setPlayerPos = function(_floatPosx, _floatPosy, _intRot)
{
    // the created minimap .dds file has dimensions 512*512
    var pX = _floatPosy * 512; // т.к. карта повёрнута на -90 градусов, поменяем координаты x и y местами
    var pY = _floatPosx * 512;
 
    PlayerPosMC._x = pX;
    PlayerPosMC._y = pY;
 
    PlayerPosMC._rotation = -_intRot;
}