• <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>

            Where there is a dream ,there is hope

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

            常用鏈接

            留言簿(1)

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

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

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

            綜述

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

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

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

            詳細(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)在我們開(kāi)始從代碼入手,我們將會(huì)從本頁(yè)的底部看到數(shù)據(jù)是如何組織的。
            在Update函數(shù)中,當(dāng)輸入GoLeft激活的時(shí)候會(huì)觸發(fā)WalkLeft動(dòng)畫(huà);GoRight激活的時(shí)候會(huì)觸發(fā)WalkRight函數(shù).
            當(dāng)沒(méi)有激活態(tài)的輸入時(shí),我們會(huì)移除目標(biāo)動(dòng)畫(huà),讓這個(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)畫(huà)切換到目標(biāo)動(dòng)畫(huà)將會(huì)通過(guò)這個(gè)矢量圖來(lái)計(jì)算。如果需要切換,他們將會(huì)自動(dòng)播放。
            注意:有很多的函數(shù)可以用高級(jí)的方法來(lái)控制動(dòng)畫(huà),但是99%的時(shí)候,這兩個(gè)函數(shù)是最常用的(orxObject_SetCurrentAnim() 和 orxObject_SetTargetAnim())。

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

            orxEvent_AddHandler(orxEVENT_TYPE_ANIM, EventHandler);

            好了!讓我們看下現(xiàn)在可以做什么了。
            我們說(shuō)我們想要打印出對(duì)象中哪個(gè)動(dòng)畫(huà)被播放、停止、剪切或者循環(huán)。需要寫(xiě)一下的回調(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)畫(huà)事件,所以我們可以安全的將payload 轉(zhuǎn)化為orxANIM_EVENT_PAYLOAD類(lèi)型,它在 orxAnim.h中定義。
            如果我們?cè)诓煌氖录ㄗg者注:原文是even 根據(jù)上下文推斷是作者拼寫(xiě)錯(cuò)誤)類(lèi)型中調(diào)用了同一個(gè)回調(diào)函數(shù),我們首先將會(huì)查看是否得到了一個(gè)動(dòng)畫(huà)事件,可以這樣做:

            if(_pstEvent->eType == orxEVENT_TYPE_ANIM)

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

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

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

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

            [Pivot]
            Pivot 
            = (15.031.00.0)

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

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

            創(chuàng)建幀的準(zhǔn)備工作都做好了。
            讓我們定義所有都是right-oriented的動(dòng)畫(huà)。一共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)畫(huà)本身。讓我們從ideright動(dòng)畫(huà)開(kāi)始說(shuō)起,它包含一個(gè)單幀并持續(xù)0.1秒。

            [IdleRight]
            KeyData1      
            = AnimRight6
            KeyDuration1  
            = 0.1


            太簡(jiǎn)單了,來(lái)嘗試下第二個(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)畫(huà)中所做的那樣,通過(guò)一個(gè)確定的鍵值來(lái)覆蓋任意一幀。我們?nèi)绶ㄅ谥谱龀鰈eft-oriented動(dòng)畫(huà)。通常我們使用翻轉(zhuǎn)圖形對(duì)象時(shí),我們將會(huì)在代碼運(yùn)行中做這件事。但是那不是我們的目的!讓我們來(lái)用與前面那個(gè)完全不同的方法來(lái)實(shí)現(xiàn)它!只有鏈路沒(méi)有提到了讓我們添上它。基本的鏈路結(jié)構(gòu)非常簡(jiǎn)單,我們指定源動(dòng)畫(huà)和目的動(dòng)畫(huà)。

            [IdleRightLoop]
            Source      
            = IdleRight
            Destination 
            = IdleRight

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

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


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

            資源:

            源文件: 04_Anim.c
            配置文件: 04_Anim.ini
            posted on 2010-07-05 23:21 IT菜鳥(niǎo) 閱讀(550) 評(píng)論(1)  編輯 收藏 引用 所屬分類(lèi): 翻譯文章

            Feedback

            # re: Orx教程--4.動(dòng)畫(huà) 2010-07-06 20:52 term papers
            Not every single thing would be related with custom term papers I’m having, thus, guys still shouldfind essays.   回復(fù)  更多評(píng)論
              

            99久久婷婷免费国产综合精品| 久久精品国产清自在天天线| 久久久久亚洲精品无码蜜桃| 国产精品久久精品| 久久午夜免费视频| 国产亚洲美女精品久久久久狼| 久久综合五月丁香久久激情| 99久久精品毛片免费播放| 香蕉久久夜色精品国产2020| 久久综合狠狠综合久久激情 | 亚洲欧美成人综合久久久| 久久97久久97精品免视看| 国产精品无码久久综合| 久久久这里只有精品加勒比| 久久国产精品免费| 久久免费小视频| 91久久婷婷国产综合精品青草| 欧美日韩久久中文字幕| 久久嫩草影院免费看夜色| 久久精品国产一区| 久久99国产综合精品免费| 久久久久亚洲av综合波多野结衣| 久久精品国产亚洲精品| 嫩草影院久久国产精品| 久久亚洲精品中文字幕| 亚洲日本va中文字幕久久| 香蕉aa三级久久毛片| 欧美一级久久久久久久大| 国产成人无码精品久久久免费| 久久国产乱子精品免费女| 97久久精品无码一区二区天美| 久久久国产乱子伦精品作者| 久久婷婷五月综合色奶水99啪 | 久久久久亚洲av无码专区喷水| 久久天天婷婷五月俺也去| 亚洲精品无码久久久久AV麻豆| 久久九九久精品国产免费直播| 久久免费香蕉视频| 伊人情人综合成人久久网小说 | 久久91亚洲人成电影网站| 久久久久高潮毛片免费全部播放|