通常,我們先載入配置文件,創(chuàng)建一個(gè)時(shí)鐘,然后注冊(cè)更新函數(shù),最后,創(chuàng)建我們的士兵和盒子對(duì)象。請(qǐng)?jiān)?a class="wikilink1" title="cn:orx:tutorials:main" >之間的教程中獲取更多信息。 .
然后,我們注冊(cè)輸入和特效事件
orxEvent_AddHandler(orxEVENT_TYPE_FX, EventHandler);
orxEvent_AddHandler(orxEVENT_TYPE_INPUT, EventHandler);
大家可以看到,在這兩個(gè)事件中,我們使用了同一個(gè)回調(diào)函數(shù)(EventHandler).
現(xiàn)在我們迅速的掃一眼自己的“對(duì)象”數(shù)據(jù)結(jié)構(gòu)。
typedef struct MyObject
{
orxBOOL bLock;
} MyObject;
接下來,看看如何用 orxObject_SetUserData()將它綁定到soldier上
MyObject *pstMyObject;
pstMyObject = orxMemory_Allocate(sizeof(MyObject), orxMEMORY_TYPE_MAIN);
pstMyObject->bLock = orxFALSE;
orxObject_SetUserData(pstSoldier, pstMyObject);
現(xiàn)在看看如何在Update函數(shù)中使用特效
orxSTRING zSelectedFX;
if(orxInput_IsActive("SelectWobble"))
{
zSelectedFX = "WobbleFX";
}
else if(orxInput_IsActive("SelectCircle"))
{
zSelectedFX = "CircleFX";
}
[...]
// Soldier not locked?
if(!((MyObject *)orxObject_GetUserData(pstSoldier))->bLock)
{
if(orxInput_IsActive("ApplyFX") && orxInput_HasNewStatus("ApplyFX"))
{
orxObject_AddFX(pstSoldier, zSelectedFX);
}
}
可以看到,我們通過orxObject_GetUserData()這個(gè)函數(shù)得到了我們想要的數(shù)據(jù),向solder里添加特效的方法跟添加聲音的方法如出一轍,用的都是這個(gè)函數(shù)orxObject_AddFX()。
接下來,看看EventHandler這個(gè)函數(shù)
首先是輸入方面,這里只展示了每次輸入時(shí)哪個(gè)按鍵被使用了。
if(_pstEvent->eType == orxEVENT_TYPE_INPUT)
{
if(_pstEvent->eID == orxINPUT_EVENT_ON)
{
orxINPUT_EVENT_PAYLOAD *pstPayload;
pstPayload = (orxINPUT_EVENT_PAYLOAD *)_pstEvent->pstPayload;
if(pstPayload->aeType[1] != orxINPUT_TYPE_NONE)
{
orxLOG("[%s] triggered by '%s' + '%s'.", pstPayload->zInputName, orxInput_GetBindingName(pstPayload->aeType[0], pstPayload->aeID[0]), orxInput_GetBindingName(pstPayload->aeType[1], pstPayload->aeID[1]));
}
else
{
orxLOG("[%s] triggered by '%s'.", pstPayload->zInputName, orxInput_GetBindingName(pstPayload->aeType[0], pstPayload->aeID[0]));
}
}
}
正如你所見,我們通過按下的是一個(gè)單鍵還是一個(gè)組合鍵來判斷展示不同的信息。
我們僅使用了兩個(gè)首次輸入點(diǎn),因?yàn)槲覀冎溃覀兊呐渲梦募袥]有超過兩個(gè)的組合鍵。盡管orx支持最多四個(gè)組合鍵來做為一個(gè)單鍵。
orxInput_GetBindingName() 函數(shù)給了我們一個(gè)輸入的文字顯示。
注意:這些名稱在配置文件中也綁定到了對(duì)應(yīng)的按鍵上面。
現(xiàn)在來看下如何處理這個(gè)事件
if(_pstEvent->eType == orxEVENT_TYPE_FX)
{
orxFX_EVENT_PAYLOAD *pstPayload;
orxOBJECT *pstObject;
pstPayload = _pstEvent->pstPayload;
pstObject = orxOBJECT(_pstEvent->hRecipient);
switch(_pstEvent->eID)
{
case orxFX_EVENT_START:
orxLOG("FX <%s>@<%s> has started!", pstPayload->zFXName, orxObject_GetName(pstObject));
if(pstObject == pstSoldier)
{
// Locks it
((MyObject *)orxObject_GetUserData(pstObject))->bLock = orxTRUE;
}
break;
case orxSOUND_EVENT_STOP:
orxLOG("FX <%s>@<%s> has stoped!", pstPayload->zFXName, orxObject_GetName(pstObject));
if(pstObject == pstSoldier)
{
// Unlocks it
((MyObject *)orxObject_GetUserData(pstObject))->bLock = orxFALSE;
}
break;
}
}
在soldier上的動(dòng)畫開始的時(shí)候,我們用自己的數(shù)據(jù)結(jié)構(gòu)來鎖定它,相應(yīng)的,停止的時(shí)候解鎖。
看完了代碼部分,我們?cè)偃タ纯磁渲梦募?
首先看個(gè)簡單的特效 :盒子上旋轉(zhuǎn)的特效。
[RotateLoopFX]
SlotList = Rotate
Loop = true
[Rotate]
Type = rotation
StartTime = 0.0
EndTime = 2.0
Curve = sine
Pow = 2.0
StartValue = 0
EndValue = 360
[Box]
FXList = RotateLoopFX
看到了吧,特效是在它創(chuàng)建之初直接應(yīng)用在盒對(duì)象上面的,而不是在代碼中。
RotateLoopFX包含僅包含一個(gè)時(shí)間段(Rotate)并且一直循環(huán)(attribute Loop)
然后定義Rotates時(shí)間段。時(shí)間的單位都是秒,角度的單位都是度。
定義這個(gè)旋轉(zhuǎn)動(dòng)畫的時(shí)候,我們使用了一個(gè)正弦曲線,讓他每兩秒旋轉(zhuǎn)360度。
下面看下我們的搖擺特效。
[WobbleFX]
SlotList = Wobble
[Wobble]
Type = scale
StartTime = 0.0
EndTime = 1.0
Period = 0.2
Curve = sine
Amplification = 0.0
StartValue = (1.0, 1.0, 1.0)
EndValue = (2.0, 2.0, 1.0) ~ (6.0, 6.0, 1.0)
我們修改了scale屬性,并賦予它一個(gè)StartValue(開始值)和EndValue(結(jié)束值)。
他們都是用向量來表示的,如果不想使用任何各向異性的值(譯者注:專業(yè)名詞anisotropic(各向異性)去知道確切意思)的話,也可是使用float類型來表示。
雖然看起來我們正在使用一個(gè)isotropic(各向同性)3)的值,這個(gè)EndValue也不過是一個(gè)隨機(jī)值。
也就是說,它的X和Y部分可能是完全統(tǒng)統(tǒng)的隨機(jī)值!
除此之外,我們使用了一個(gè)簡單的周期為0.2 秒的正弦曲線,它將會(huì)播放1秒鐘。
看到了吧,我們將Amplification(增幅) 的值設(shè)為0,這就是說,隨著時(shí)間的推進(jìn),曲線的振幅會(huì)逐漸變低。注意:默認(rèn)的Amplification是1,表示不隨時(shí)間變化,保持穩(wěn)定,當(dāng)值大于1時(shí),振幅就會(huì)加大;當(dāng)值小于1時(shí),振幅就會(huì)減少。
看看圓是如何運(yùn)動(dòng)的。
[CircleFX]
SlotList = CircleX#CircleY
KeepInCache = true
[CircleX]
Type = position
StartTime = 0.0
EndTime = 1.0
Curve = sine
StartValue = (0.0, 0.0, 0.0)
EndValue = (-50.0, 0.0, 0.0)
UseOrientation = true
UseScale = true
[CircleY@CircleX]
Phase = 0.25
StartValue = (0.0, -25.0, 0.0)
EndValue = (0.0, 25.0, 0.0)
Here we need to use 2 slots that affects the position so as to be able to have a circle motion.
The first slot, CircleX, will apply a sine curve on the X component of our object's position.
The second slot, CircleY, will apply the same curve (with a different amplitude) on its Y component.
我們使用兩個(gè)時(shí)間段來控制它的位置,這樣才能做出一個(gè)圓形的運(yùn)動(dòng)。第一個(gè)時(shí)間段是CircleX,他將會(huì)應(yīng)用在對(duì)象的X軸向的振幅。第二個(gè)時(shí)間段CircleY,會(huì)產(chǎn)生一個(gè)同樣幅度的作用效果在Y軸上。
如果我們不更改CircleY的相位,是不會(huì)發(fā)生圓形的運(yùn)動(dòng)。
現(xiàn)在假設(shè)一個(gè)正弦曲線,在初始值(StartValue)是相位0,準(zhǔn)備增加
在相位0。25的時(shí)候,到達(dá)中間點(diǎn),將會(huì)繼續(xù)增加
在相位0.5的時(shí)候,到達(dá)最高值(EndValue),準(zhǔn)備下降
在相位0.75的時(shí)候,回到中間點(diǎn),繼續(xù)下降
在相位1.0的時(shí)候,就跟相位0(StartValue)是一樣的了
注意:這段描述正弦曲線的工作過程也同樣適用于三角形,但是卻不適用于線形。
我們將略過大多數(shù)其他的特效,因?yàn)槟抢餂]有什么我們不知道的新知識(shí)了。
但是我們還是要迅速的看一眼翻轉(zhuǎn)的特效,他將會(huì)向我們展示如何翻轉(zhuǎn)一個(gè)對(duì)象。就像Paper Mario Wii4)的風(fēng)格.
[FlipFX]
SlotList = Flip
[Flip@Wobble]
EndTime = 0.5
Period = 1.0
Amplification = 1.0
EndValue = (-1.0, 1.0, 1.0)
看到了吧,我們很簡單的使用負(fù)值完成了這個(gè)效果! 
同時(shí)也注意到,我們給Period(周期)設(shè)了一個(gè)明確的值。
我們選了一個(gè)兩倍于定義的正弦曲線的Period,這樣我們就只使用了正弦曲線的上升的那一半。同時(shí),我們也將Amplification改回了1。(在”“Wobble”“中被設(shè)為0)