scaleform是制作UI的好工具:
1.他可以解放程式員用代碼控制的UI效果,例如平移,旋轉和縮放都手到擒來。如果要做複雜的動畫頁面,單純的靠代碼來實作非常的麻煩。
2.他可以結合遊戲引擎使用renderTarget的形式實作立體UI。這一點非常的酷。像老生常談的《死亡空間》和最新的《進階戰争》。
入正題,設定讓ActionScript和UnrealScript實作互動。
Flash:
1.引入PNG圖檔到庫中。正确的設定其屬性,删除字尾。我們引入一個按鈕圖檔一個滑鼠指針,用來實作滑鼠按鈕點選的功能實作:
在時間軸上建立5個通道,一個為action,在第一幀上插入AS2腳本代碼。我們設定了三個按鈕,每一個按鈕放在一個單獨的時間軸上,用F8将那幾張圖檔轉換為button。将三個按鈕分别拖拽入場景中,屬性執行個體名分别為btn1,btn2,btn3。然後在action時間軸的第一幀上填寫代碼
import flash.external.ExternalInterface;
import gfx.controls.Button;
import gfx.motion.Tween;
_global.gfxExtensions=true;
import mx.utils.Delegate;
btn1.onPress=function()
{
ExternalInterface.call('attack');
trace("attack button pressed");
}
btn2.onPress=function()
{
ExternalInterface.call('Jump');
trace("jump button pressed");
}
btn3.onPress=function()
{
ExternalInterface.call('Defense');
trace("defense button pressed");
}
上邊的代碼分别定義了每一個按鈕按下之後所對應的unrealscript函數,例如call('attack')中'attack'。
接下來設定滑鼠指針,點選滑鼠指針,然後F9填寫代碼
onClipEvent(enterFrame)
{
_x=_root._xmouse
_y=_root._ymouse
}
該段代碼可以讓滑鼠出現。
UnrealScript:
我們打算借用HUD來顯示調用自己的新scaleform頁面,建立一個類AntGFXMenu,該類繼承自GFXMoviePlayer。在HUD中有:
var AntGFXMenu MenuMovie;
//建立
function CreateGFXMenu()
{
MenuMovie=new class'AntGFXMenu';
MenuMovie.SetTimingMode(TM_Real);
MenuMovie.Initialize(); //在AntGFXMenu中自定義的初始化
}
//銷毀
singular event Destroyed()
{
super.Destroyed();
if(MenuMovie!=none)
{
MenuMovie.Close(true);
MenuMovie=none;
}
}
//在HUD的DrawHUD類中
function DrawHUD()
{
//調用scaleform的重新整理渲染
MenuMovie.TickHUD();
}
在AntGFXMovie類中
class AntGFXMenu extends GFXMoviePlayer;
//尋找Flash中定義的變量元件,我們隻實作滑鼠和按鈕
var GFXObject AttackButton,Cursor;
//功能實作
function Initialize()
{
Start(); //scaleform的初始化函數
Advance(0.f);
AttackButton=GetVariableObject("_root.btn1");//Flash中變量名
Cursor=GetVariableObject("_root.cursor_mc");//擷取滑鼠
}
//實時更新用得着
function TickHUD()
{//實時更新的動作
}
defaultproperties
{
bDisplayWithHUDoff=false //是否幹掉HUD
MovieInfo=swfMovie'Test.MenuTest' //菜單
bIgnoreMouseInfo=false
}
以上是一般的通常步驟,下面的代碼用于示範unrealscript調用actionscript的方法;
//在function之前
delegate AttackDelegate();
//實作按鈕的函數定義,AS中ExternalInterface.call('attack');
function SetupAttackDelegate(delegate<AttackDelegate> d)
{
local GFXObject RootObj;
RootObj=GetVariableObject("_root"); //我們的action第一幀
ActionScriptSetFunction(RootObj,"Attack"); //ActionScript中
}
//as調用的函數
function Attack()
{
AntPlayerController(GetPC()).GiveMoney();
}