• <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++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
              64 Posts :: 0 Stories :: 8 Comments :: 0 Trackbacks

            常用鏈接

            留言簿(1)

            我參與的團隊

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

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

            綜述

            這篇教程只涉及了orx中最基本的動畫使用。

            更多關于動畫的東西在這里 猛擊我.

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

            詳細內容

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

            現在我們開始從代碼入手,我們將會從本頁的底部看到數據是如何組織的。
            在Update函數中,當輸入GoLeft激活的時候會觸發WalkLeft動畫;GoRight激活的時候會觸發WalkRight函數.
            當沒有激活態的輸入時,我們會移除目標動畫,讓這個圖保持一個自然的狀態

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

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

            else
            {
              orxObject_SetTargetAnim(pstSoldier, orxNULL);
            }

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

            讓我們來看一下,動畫是如何通知我們發生了什么的(比如,就像同步語音一樣)。
            首先,我們要向動畫事件注冊回調函數。

            orxEvent_AddHandler(orxEVENT_TYPE_ANIM, EventHandler);

            好了!讓我們看下現在可以做什么了。
            我們說我們想要打印出對象中哪個動畫被播放、停止、剪切或者循環。需要寫一下的回調函數。

            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指針,因為我們只是在這里傳遞動畫事件,所以我們可以安全的將payload 轉化為orxANIM_EVENT_PAYLOAD類型,它在 orxAnim.h中定義。
            如果我們在不同的事件(譯者注:原文是even 根據上下文推斷是作者拼寫錯誤)類型中調用了同一個回調函數,我們首先將會查看是否得到了一個動畫事件,可以這樣做:

            if(_pstEvent->eType == orxEVENT_TYPE_ANIM)

            最后,事件接收者(_pstEvent→hRecipient)通常是播放動畫的那個對象。將其用宏orxOBJECT()來轉化為orOBJECT類型的對象。

            現在讓我們來看一眼數據方面的東西吧。
            首先,我們需要定義一個動畫集,它將會包含指定對象的動畫的整個矢量圖。
            動畫集在不會再內存中重復,并且它與矢量圖相對應的多有動畫和鏈路。
            在上面這個例子中,我們又4個動畫和10條可以用來切換的鏈路。

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

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

            [Pivot]
            Pivot 
            = (15.031.00.0)

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

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

            創建幀的準備工作都做好了。
            讓我們定義所有都是right-oriented的動畫。一共6個。

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


            看到了吧,他們全都繼承于FullGraphic,唯一能區分他們的屬性就是TextureCorner. 好,我們已經定義完了所有的圖形對象(他們載入的時候會轉變為orxGraphic結構),下面定義動畫本身。讓我們從ideright動畫開始說起,它包含一個單幀并持續0.1秒。

            [IdleRight]
            KeyData1      
            = AnimRight6
            KeyDuration1  
            = 0.1


            太簡單了,來嘗試下第二個:

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


            當我們使用DefaultKeyDuration屬性同時為所有的幀定義時并不是很難。我們可以像idleright動畫中所做的那樣,通過一個確定的鍵值來覆蓋任意一幀。我們如法炮制做出left-oriented動畫。通常我們使用翻轉圖形對象時,我們將會在代碼運行中做這件事。但是那不是我們的目的!讓我們來用與前面那個完全不同的方法來實現它!只有鏈路沒有提到了讓我們添上它。基本的鏈路結構非常簡單,我們指定源動畫和目的動畫。

            [IdleRightLoop]
            Source      
            = IdleRight
            Destination 
            = IdleRight

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

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


            當我們再WalkRight狀態并且移除了目標動畫,引擎不得按照自然的路線走下去。這個意思是說,它會選取高優先級的鏈路。默認的優先級是8,它的范圍是0到15.在這里,優先級是9,也就是說當我們沒有目標的時候,就會選取它。它將會帶我們回到IdleRight狀態。這里也加了immdiate屬性,這樣,我們就不必等“走”這個循環完事再回到“空閑”
             
            注意:這只是一個非常基本的圖,用來闡述基本的動畫切換過程,但是這個系統的擴展性很高。比如假設這樣一個場景:你想從坐的狀態變為走的狀態,中間沒有別的過度。隨著游戲的開發,你可能覺得在這兩個狀態間加一個站立的狀態會比較好。這時,你只需要再配置文件中添加這多出來的一步,而整個代碼文件都不用更改。

            資源:

            源文件: 04_Anim.c
            配置文件: 04_Anim.ini
            posted on 2010-07-05 23:21 IT菜鳥 閱讀(552) 評論(1)  編輯 收藏 引用 所屬分類: 翻譯文章

            Feedback

            # re: Orx教程--4.動畫 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.   回復  更多評論
              

            18禁黄久久久AAA片| 青青草国产精品久久| 亚洲一区精品伊人久久伊人| 久久精品国产亚洲av麻豆图片| 国产精品久久影院| 久久不见久久见免费视频7| 色婷婷综合久久久久中文字幕| 嫩草影院久久国产精品| 国产精品日韩深夜福利久久 | 久久永久免费人妻精品下载| 久久综合日本熟妇| 久久久亚洲精品蜜桃臀 | 亚洲精品高清国产一线久久| 久久午夜综合久久| 99久久免费国产精品热| 精品久久久久久久国产潘金莲| 久久伊人精品青青草原高清| 狠狠色丁香久久婷婷综合| 久久天天躁夜夜躁狠狠| 国产激情久久久久影院老熟女| 精品国产青草久久久久福利| 青青草国产97免久久费观看| 久久精品国产精品青草| 青青热久久综合网伊人| 久久综合给合久久国产免费| 性做久久久久久久久久久| 亚洲国产成人久久精品影视| 久久人人爽人人爽人人片AV麻豆| av无码久久久久久不卡网站| 国产福利电影一区二区三区久久久久成人精品综合 | 2022年国产精品久久久久| 久久久久高潮综合影院| 少妇人妻综合久久中文字幕 | 亚洲国产精品无码久久一区二区| 欧美精品丝袜久久久中文字幕 | 久久国产精品99精品国产987| 一本久久知道综合久久| 亚洲国产精品无码久久SM| 亚洲国产另类久久久精品黑人| 久久人人爽人人爽人人片av麻烦| 久久亚洲AV无码精品色午夜麻豆|