青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Where there is a dream ,there is hope

  C++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
  64 Posts :: 0 Stories :: 8 Comments :: 0 Trackbacks

常用鏈接

留言簿(1)

我參與的團(tuán)隊(duì)

搜索

  •  

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

#

晚上 抽風(fēng) ,折騰電腦 ,安 了 個(gè) UBUNTU.
夜深了 ,明早起 來 在 這 下 面 寫個(gè) 小 程序玩下 .

posted @ 2010-10-23 01:26 IT菜鳥 閱讀(211) | 評(píng)論 (0)編輯 收藏

綜述

參看前面的教程基礎(chǔ), 對(duì)象創(chuàng)建, 時(shí)鐘 , 框架層次結(jié)構(gòu)動(dòng)畫 視口與攝像機(jī),和 聲音與音樂
這篇教程介紹了什么是特效以及如何創(chuàng)建它們
特效是將曲線及其組合而成的一組數(shù)據(jù)(正弦線、三角型邊、矩形或者線性),應(yīng)用在不同類型的參數(shù)中。如:縮放、旋轉(zhuǎn)、位置、速度、顏色等。

特效在配置文件中設(shè)置,僅僅只需要一行代碼就可以在對(duì)象上使用這些特效。
可以有最多8條任意類型的曲線組合在一起形成一個(gè)特效。
在同一時(shí)間,可以有最多4個(gè)特效應(yīng)用于同一個(gè)對(duì)象上面。

特效可以使用絕對(duì)值或者相對(duì)值,這取決于配置文件中Absolute標(biāo)簽。
控制曲線的周期、相位、和振幅都是允許的。
對(duì)于位置和速度特效來說,輸出值可以使用對(duì)象的方向 和/或 縮放值,以相對(duì)方式應(yīng)用于對(duì)象目前的狀態(tài)。

這也就允許我們創(chuàng)造極其拉風(fēng)的視覺特效。

除非特效已經(jīng)緩存在內(nèi)存中,否則特效參數(shù)全部在配置文件中進(jìn)行調(diào)整,并且使用退格鍵來即時(shí)重載。 (cf.通過 KeepInCache 屬性來實(shí)現(xiàn)內(nèi)存的緩存).
比如說:你不能調(diào)整正在運(yùn)行的循環(huán)特效,因?yàn)樗呀?jīng)在默認(rèn)的配置文件中定義好了。在這個(gè)測(cè)試程序運(yùn)行的時(shí)候,所有其它的特效能夠被更新。

通常說來,隨機(jī)值的使用可以給特效帶來更多的變化。
比如, 晃動(dòng)方式的縮放(the wobble scale), 帶顏色的閃光(the flash color) 和 攻擊式的移動(dòng)(the “attack” move) 等特效就使用了少量的隨機(jī)值.

就像顯示事件一樣,我們也可以注冊(cè)特效的開始播放和停止的事件。因?yàn)檠h(huán)時(shí)間是永遠(yuǎn)不會(huì)停下來的,所以對(duì)應(yīng)的停止事件(orxFX_EVENT_STOP)永遠(yuǎn)不會(huì)發(fā)生. 我們也會(huì)簡單的介紹一下如何一些個(gè)性數(shù)據(jù)(僅僅包含一個(gè)布爾值的結(jié)構(gòu))添加到orxOBJECT中。1)
在事件的回調(diào)函數(shù)中,我們通過它,在特效開始的時(shí)候?yàn)閷?duì)象加鎖,在結(jié)束的時(shí)候解鎖。
我們使用鎖是為了讓soldier(士兵)在同一時(shí)刻只有一個(gè)特效在發(fā)揮作用。
把這些東西寫在這里,僅僅具有教育意義。2)

詳細(xì)內(nèi)容

通常,我們先載入配置文件,創(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)

資源

源代碼: 07_FX.c

配置文件: 07_FX.ini

1) 九天注:這里作者有點(diǎn)穿越了,需要看下面的例子才能懂,作者定義了一個(gè)僅包含一個(gè)Bool值的結(jié)構(gòu)MyObject,這里的括號(hào),作者打在了orxOBJECT后面,我費(fèi)解了N久,其實(shí)應(yīng)該修飾個(gè)性數(shù)據(jù),所以個(gè)人調(diào)整了一下。
2) 九天注:本來一個(gè)對(duì)象可以同時(shí)有4個(gè)特效發(fā)生,這里作者僅僅是告訴你怎么使用“個(gè)性數(shù)據(jù)”才這樣做的,所以說僅僅具有教育意義。
3) Z值不影響2D元素
4) 九天注:Wii上的紙片馬里奧是個(gè)很出名的游戲,作者的意思就是這里的flip描述的就是那個(gè)游戲里面的風(fēng)格和效果
posted @ 2010-07-07 08:58 IT菜鳥 閱讀(331) | 評(píng)論 (0)編輯 收藏

     摘要: 綜述 這篇教程介紹了什么是特效以及如何創(chuàng)建它們   特效是建立在曲線集(線、三角形、矩形、)之上的,它們具有不同參數(shù)如:大小、旋度、位置、速度、顏色等。   特效在配置文件中設(shè)置,僅僅只需要一行代碼就可以在對(duì)象上使用這些特效。 8條任意類型的曲線組合在一起就可以形成一個(gè)特效。 在同一時(shí)間,可以有多達(dá)4個(gè)特效應(yīng)用于同一個(gè)對(duì)象上面。   特效可以使用絕對(duì)...  閱讀全文
posted @ 2010-07-06 13:27 IT菜鳥 閱讀(427) | 評(píng)論 (0)編輯 收藏

原文:http://orx-project.org/wiki/en/orx/tutorials/anim

綜述

這篇教程只涉及了orx中最基本的動(dòng)畫使用。

更多關(guān)于動(dòng)畫的東西在這里 猛擊我.

圖定義了動(dòng)畫間所有可能的切換方式。動(dòng)畫通過一個(gè)唯一的字符串來引用。所有的切換和動(dòng)畫都是通過配置文件來創(chuàng)建的。
當(dāng)一個(gè)動(dòng)畫被請(qǐng)求的時(shí)候,引擎會(huì)計(jì)算從當(dāng)前動(dòng)畫到請(qǐng)求動(dòng)畫之間的鏈路
如果這個(gè)鏈路存在,它會(huì)自動(dòng)執(zhí)行。用戶將通過事件被告知?jiǎng)赢嫼螘r(shí)開始、停止、刪節(jié)或者循環(huán)。
如果我們不能具體制定任何目標(biāo)動(dòng)畫,引擎就會(huì)很自然的沿著屬性中定義的線路(走下去)。
也有一個(gè)方法來越過這個(gè)尋路過程并且迅速的指向一個(gè)動(dòng)畫。

詳細(xì)內(nèi)容

通常,我們先載入config file(配置文件),創(chuàng)建一個(gè)viewport,創(chuàng)建一個(gè)clock(時(shí)鐘)并且注冊(cè)Update(更新)函數(shù),最后創(chuàng)建一個(gè)主對(duì)象。
請(qǐng)從之前的教程中獲得更多的信息。

現(xiàn)在我們開始從代碼入手,我們將會(huì)從本頁的底部看到數(shù)據(jù)是如何組織的。
在Update函數(shù)中,當(dāng)輸入GoLeft激活的時(shí)候會(huì)觸發(fā)WalkLeft動(dòng)畫;GoRight激活的時(shí)候會(huì)觸發(fā)WalkRight函數(shù).
當(dāng)沒有激活態(tài)的輸入時(shí),我們會(huì)移除目標(biāo)動(dòng)畫,讓這個(gè)圖保持一個(gè)自然的狀態(tài)

if(orxInput_IsActive("GoRight"))
{
  orxObject_SetTargetAnim(pstSoldier, 
"WalkRight");
}

else if(orxInput_IsActive("GoLeft"))
{
  orxObject_SetTargetAnim(pstSoldier, 
"WalkLeft");
}

else
{
  orxObject_SetTargetAnim(pstSoldier, orxNULL);
}

就是這樣!如何從任意當(dāng)前動(dòng)畫切換到目標(biāo)動(dòng)畫將會(huì)通過這個(gè)矢量圖來計(jì)算。如果需要切換,他們將會(huì)自動(dòng)播放。
注意:有很多的函數(shù)可以用高級(jí)的方法來控制動(dòng)畫,但是99%的時(shí)候,這兩個(gè)函數(shù)是最常用的(orxObject_SetCurrentAnim() 和 orxObject_SetTargetAnim())。

讓我們來看一下,動(dòng)畫是如何通知我們發(fā)生了什么的(比如,就像同步語音一樣)。
首先,我們要向動(dòng)畫事件注冊(cè)回調(diào)函數(shù)。

orxEvent_AddHandler(orxEVENT_TYPE_ANIM, EventHandler);

好了!讓我們看下現(xiàn)在可以做什么了。
我們說我們想要打印出對(duì)象中哪個(gè)動(dòng)畫被播放、停止、剪切或者循環(huán)。需要寫一下的回調(diào)函數(shù)。

orxSTATUS orxFASTCALL EventHandler(const orxEVENT *_pstEvent)
{
orxANIM_EVENT_PAYLOAD 
*pstPayload;
 
pstPayload 
= (orxANIM_EVENT_PAYLOAD *)_pstEvent->pstPayload;
 
switch(_pstEvent->eID)
{
  
case orxANIM_EVENT_START:
    orxLOG(
"Animation <%s>@<%s> has started!", pstPayload->zAnimName, orxObject_GetName(orxOBJECT(_pstEvent->hRecipient)));
    
break;
 
  
case orxANIM_EVENT_STOP:
    orxLOG(
"Animation <%s>@<%s> has stoped!", pstPayload->zAnimName, orxObject_GetName(orxOBJECT(_pstEvent->hRecipient)));
    
break;
 
  
case orxANIM_EVENT_CUT:
    orxLOG(
"Animation <%s>@<%s> has been cut!", pstPayload->zAnimName, orxObject_GetName(orxOBJECT(_pstEvent->hRecipient)));
    
break;
 
  
case orxANIM_EVENT_LOOP:
    orxLOG(
"Animation <%s>@<%s> has looped!", pstPayload->zAnimName, orxObject_GetName(orxOBJECT(_pstEvent->hRecipient)));
    
break;
  }

 
  
return orxSTATUS_SUCCESS;
}

先得到了事件的payload指針,因?yàn)槲覀冎皇窃谶@里傳遞動(dòng)畫事件,所以我們可以安全的將payload 轉(zhuǎn)化為orxANIM_EVENT_PAYLOAD類型,它在 orxAnim.h中定義。
如果我們?cè)诓煌氖录ㄗg者注:原文是even 根據(jù)上下文推斷是作者拼寫錯(cuò)誤)類型中調(diào)用了同一個(gè)回調(diào)函數(shù),我們首先將會(huì)查看是否得到了一個(gè)動(dòng)畫事件,可以這樣做:

if(_pstEvent->eType == orxEVENT_TYPE_ANIM)

最后,事件接收者(_pstEvent→hRecipient)通常是播放動(dòng)畫的那個(gè)對(duì)象。將其用宏orxOBJECT()來轉(zhuǎn)化為orOBJECT類型的對(duì)象。

現(xiàn)在讓我們來看一眼數(shù)據(jù)方面的東西吧。
首先,我們需要定義一個(gè)動(dòng)畫集,它將會(huì)包含指定對(duì)象的動(dòng)畫的整個(gè)矢量圖。
動(dòng)畫集在不會(huì)再內(nèi)存中重復(fù),并且它與矢量圖相對(duì)應(yīng)的多有動(dòng)畫和鏈路。
在上面這個(gè)例子中,我們又4個(gè)動(dòng)畫和10條可以用來切換的鏈路。

[AnimSet]
AnimationList 
= IdleRight#WalkRight#IdleLeft#WalkLeft
 
LinkList 
= IdleRightLoop#IdleRight2Left#IdleRight2WalkRight#WalkRightLoop#WalkRight2IdleRight#IdleLeftLoop#IdleLeft2Right#IdleLeft2WalkLeft#WalkLeftLoop#WalkLeft2IdleLeft

現(xiàn)在我們來開始定義動(dòng)畫!
在這之前,為了減少文章篇幅,我們將要使用orx 配置文件的集成特性。
先錨點(diǎn)的位置定義一項(xiàng)。
也許你可能在對(duì)象教程中看到了錨點(diǎn)的相關(guān)知識(shí),錨點(diǎn)的位置信息將會(huì)匹配世界中的對(duì)象。如果沒有確定的話,將會(huì)把左上角做為默認(rèn)值。
錨點(diǎn)可以通過語義關(guān)鍵字來確定,如: top, bottom, center, left and right也可以通過實(shí)際的值來確定。

[Pivot]
Pivot 
= (15.031.00.0)

現(xiàn)在,我們來定義從錨點(diǎn)繼承過來的圖像對(duì)象。在我們這個(gè)例子中,它是一個(gè)位圖,,包含了對(duì)象中所有的幀。因此基本的屬性就是 位圖文件的名字和一幀的大小。

[FullGraphic@Pivot]
Texture     
= ../../data/anim/soldier_full.png
TextureSize 
= (32320)

創(chuàng)建幀的準(zhǔn)備工作都做好了。
讓我們定義所有都是right-oriented的動(dòng)畫。一共6個(gè)。

[AnimRight1@FullGraphic]
TextureCorner 
= (000)
 
[AnimRight2@FullGraphic]
TextureCorner 
= (0320)
 
[AnimRight3@FullGraphic]
TextureCorner 
= (0640)
 
[AnimRight4@FullGraphic]
TextureCorner 
= (3200)
 
[AnimRight5@FullGraphic]
TextureCorner 
= (32320)
 
[AnimRight6@FullGraphic]
TextureCorner 
= (32640)


看到了吧,他們?nèi)祭^承于FullGraphic,唯一能區(qū)分他們的屬性就是TextureCorner. 好,我們已經(jīng)定義完了所有的圖形對(duì)象(他們載入的時(shí)候會(huì)轉(zhuǎn)變?yōu)閛rxGraphic結(jié)構(gòu)),下面定義動(dòng)畫本身。讓我們從ideright動(dòng)畫開始說起,它包含一個(gè)單幀并持續(xù)0.1秒。

[IdleRight]
KeyData1      
= AnimRight6
KeyDuration1  
= 0.1


太簡單了,來嘗試下第二個(gè):

[WalkRight]
DefaultKeyDuration  
= 0.1
KeyData1            
= AnimRight1
KeyData2            
= AnimRight2
KeyData3            
= AnimRight3
KeyData4            
= AnimRight4
KeyData5            
= AnimRight5
KeyData6            
= AnimRight6


當(dāng)我們使用DefaultKeyDuration屬性同時(shí)為所有的幀定義時(shí)并不是很難。我們可以像idleright動(dòng)畫中所做的那樣,通過一個(gè)確定的鍵值來覆蓋任意一幀。我們?nèi)绶ㄅ谥谱龀鰈eft-oriented動(dòng)畫。通常我們使用翻轉(zhuǎn)圖形對(duì)象時(shí),我們將會(huì)在代碼運(yùn)行中做這件事。但是那不是我們的目的!讓我們來用與前面那個(gè)完全不同的方法來實(shí)現(xiàn)它!只有鏈路沒有提到了讓我們添上它。基本的鏈路結(jié)構(gòu)非常簡單,我們指定源動(dòng)畫和目的動(dòng)畫。

[IdleRightLoop]
Source      
= IdleRight
Destination 
= IdleRight

這里,我們有跟之前一樣的基本信息,但是多了一個(gè)immediate屬性做為鍵值。這就是說,當(dāng)我們處于IdleRight動(dòng)畫時(shí),并且目標(biāo)是WalkRight,我們不必等到IdleRight完成,將直接完成這個(gè)動(dòng)作,這就給了我們一個(gè)剪切動(dòng)畫的方法。 正如在代碼中看到的一樣。當(dāng)我們已經(jīng)開始行走的時(shí)候,沒有顯式的調(diào)用空閑動(dòng)畫,這是怎么做到的?看下從WalkRight到IdleRight的鏈路。

[IdleRight2WalkRight]
Source      
= IdleRight
Destination 
= WalkRight
Property    
= immediate


當(dāng)我們?cè)賅alkRight狀態(tài)并且移除了目標(biāo)動(dòng)畫,引擎不得按照自然的路線走下去。這個(gè)意思是說,它會(huì)選取高優(yōu)先級(jí)的鏈路。默認(rèn)的優(yōu)先級(jí)是8,它的范圍是0到15.在這里,優(yōu)先級(jí)是9,也就是說當(dāng)我們沒有目標(biāo)的時(shí)候,就會(huì)選取它。它將會(huì)帶我們回到IdleRight狀態(tài)。這里也加了immdiate屬性,這樣,我們就不必等“走”這個(gè)循環(huán)完事再回到“空閑”
 
注意:這只是一個(gè)非常基本的圖,用來闡述基本的動(dòng)畫切換過程,但是這個(gè)系統(tǒng)的擴(kuò)展性很高。比如假設(shè)這樣一個(gè)場(chǎng)景:你想從坐的狀態(tài)變?yōu)樽叩臓顟B(tài),中間沒有別的過度。隨著游戲的開發(fā),你可能覺得在這兩個(gè)狀態(tài)間加一個(gè)站立的狀態(tài)會(huì)比較好。這時(shí),你只需要再配置文件中添加這多出來的一步,而整個(gè)代碼文件都不用更改。

資源:

源文件: 04_Anim.c
配置文件: 04_Anim.ini
posted @ 2010-07-05 23:21 IT菜鳥 閱讀(575) | 評(píng)論 (1)編輯 收藏

僅列出標(biāo)題
共7頁: 1 2 3 4 5 6 7 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲日韩欧美一区二区在线| 亚洲一二区在线| 欧美日韩精品一区二区在线播放| 亚洲欧美伊人| 亚洲免费观看高清完整版在线观看熊| 久久久夜夜夜| 亚洲一区观看| 亚洲免费观看高清在线观看| 激情五月***国产精品| 国产精品草草| 欧美日韩一区自拍| 欧美粗暴jizz性欧美20| 久久精品视频亚洲| 羞羞漫画18久久大片| 亚洲美女中文字幕| 亚洲欧洲一区二区在线播放| 久久综合久久综合九色| 欧美怡红院视频| 亚洲专区在线视频| 欧美成人国产一区二区| 亚洲网站在线看| 亚洲免费电影在线观看| 亚洲高清免费| 一色屋精品视频在线观看网站| 国产精品伦理| 欧美视频不卡| 欧美日韩亚洲高清一区二区| 欧美日韩国产成人| 欧美精品福利视频| 欧美第一黄网免费网站| 欧美成人亚洲| 欧美激情综合亚洲一二区| 欧美成人精品| 欧美精品一区二区三区很污很色的 | 亚洲欧美激情视频在线观看一区二区三区| 亚洲伦理在线| 日韩视频久久| 99视频精品在线| 日韩小视频在线观看| 99re热精品| 亚洲尤物影院| 香蕉久久精品日日躁夜夜躁| 久久国产福利| 久久天堂国产精品| 欧美极品aⅴ影院| 欧美日韩专区| 国产精品一区二区三区四区| 国产视频在线观看一区二区| 激情综合久久| 亚洲理论电影网| 亚洲一区二区免费| 久久爱91午夜羞羞| 毛片基地黄久久久久久天堂| 鲁大师影院一区二区三区| 亚洲第一天堂无码专区| 亚洲精品美女免费| 亚洲一区免费| 久久久久久久久久久久久9999| 免费欧美日韩| 欧美网站大全在线观看| 国产日本欧美在线观看| ●精品国产综合乱码久久久久| 亚洲日本电影| 亚洲欧美在线视频观看| 久久人人97超碰精品888| 亚洲第一区在线| 一区二区三区高清视频在线观看| 亚洲欧美日韩成人| 卡通动漫国产精品| 国产精品美女午夜av| 今天的高清视频免费播放成人| 日韩午夜精品视频| 香蕉成人啪国产精品视频综合网| 老司机精品导航| av成人福利| 久久久久成人精品| 欧美日韩中文在线观看| 国产亚洲午夜| 中日韩视频在线观看| 久久婷婷久久| 夜夜爽夜夜爽精品视频| 久久先锋影音| 国产精品视频1区| 亚洲国产天堂久久国产91| 亚洲砖区区免费| 欧美国产精品劲爆| 羞羞色国产精品| 欧美日韩中文字幕在线视频| 伊人伊人伊人久久| 午夜久久影院| 亚洲区一区二| 久久久久久久国产| 国产伦精品一区二区三区免费| 亚洲国产精品一区| 久久成人亚洲| 中文精品99久久国产香蕉| 美女视频黄免费的久久| 国产午夜精品一区二区三区视频 | 99精品视频免费全部在线| 欧美亚洲视频在线看网址| 欧美日韩一二三区| 亚洲日本乱码在线观看| 久久嫩草精品久久久精品一| 在线亚洲一区观看| 欧美激情视频在线播放| 亚洲国产精品t66y| 久久精品国产精品亚洲| 9l视频自拍蝌蚪9l视频成人| 欧美成人自拍视频| 激情五月综合色婷婷一区二区| 亚洲欧美激情四射在线日| 亚洲日本成人网| 欧美成人黄色小视频| …久久精品99久久香蕉国产| 久久久999精品免费| 亚洲男人的天堂在线aⅴ视频| 欧美日韩一区二区在线观看视频| 亚洲精品乱码久久久久久蜜桃91| 欧美v亚洲v综合ⅴ国产v| 欧美中文字幕在线观看| 国产午夜精品理论片a级探花| 午夜视频久久久久久| 一区二区日韩伦理片| 欧美日韩一卡| 亚洲网站在线| 亚洲素人在线| 国产精品爽爽爽| 性欧美暴力猛交另类hd| 亚洲天堂免费在线观看视频| 国产精品白丝jk黑袜喷水| 亚洲一区二区毛片| 亚洲一区欧美一区| 国产乱码精品一区二区三区av| 欧美一区二区三区在线观看视频| 亚洲主播在线| 国产一区视频在线看| 美脚丝袜一区二区三区在线观看| 久久久水蜜桃| 最新日韩中文字幕| 日韩午夜免费| 国产精品福利网| 久久精品九九| 久久精品视频播放| 91久久国产综合久久蜜月精品 | 亚洲调教视频在线观看| 国产精品久久久久久久久久ktv| 午夜精品久久久久久久99水蜜桃| 午夜精品久久久99热福利| 激情自拍一区| 亚洲人成77777在线观看网| 欧美日韩成人精品| 欧美一区二区三区久久精品茉莉花 | 午夜精品免费视频| 狠狠综合久久av一区二区小说| 女仆av观看一区| 欧美国产精品v| 香蕉成人伊视频在线观看| 久久不射网站| 一本色道久久综合一区| 亚洲一区二区精品| 好看不卡的中文字幕| 亚洲第一在线综合在线| 欧美视频中文一区二区三区在线观看| 久久av一区| 欧美aⅴ一区二区三区视频| 亚洲一区二区三区精品视频| 欧美一区二区性| 亚洲剧情一区二区| 午夜精品区一区二区三| 亚洲国产欧美不卡在线观看| 9i看片成人免费高清| 国模套图日韩精品一区二区| 亚洲人成人77777线观看| 国产精品一区二区你懂的| 欧美成人精品| 国产精品黄视频| 欧美激情一二区| 国产精品捆绑调教| 欧美华人在线视频| 国产伦精品一区二区三区高清版| 欧美高清在线| 国产日韩欧美一区在线| 亚洲国产第一| 国产一区二区三区在线免费观看| 亚洲国产第一| 国外成人在线视频| 一二三区精品| 91久久精品日日躁夜夜躁欧美 | 亚洲综合精品自拍| 久久精视频免费在线久久完整在线看| 国产精品99久久久久久宅男| 久久精品国产在热久久| 亚洲一区在线免费| 牛人盗摄一区二区三区视频| 久久er精品视频| 欧美日本视频在线| 亚洲电影中文字幕| 好吊色欧美一区二区三区四区| 中文精品一区二区三区| 亚洲免费观看在线观看|