<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                上一篇我們主要講了Cocos2d_android一些布置游戲場景的知識,這一篇重點講下Cocos2d_android的事件觸發,沒看過上一篇的可以先去看下。 [Cocos2d_android你所需要知道的一切](http://blog.csdn.net/u014486880/article/details/50418485) 對于本章我做了個demo,完成各種動畫。先看下效果圖。 ![](https://box.kancloud.cn/2016-04-08_570771b63447d.jpg) 點擊不同的圣誕樹會有不同的動畫。因為屏幕有限演示的動畫有限,但實現思路都是一樣的。 ### 一,Action的簡介 Cocos2d_android的CCAction總共有四類子類,它們分別是CCFiniteTimeAction,CCFollow,CCRepeatForever,CCSpeed。它們的含義如下: CCFiniteTimeAction:表示受時間限制的動作,這可以說是最常見的,因為通常動畫都是需要一定時間來完成的。它有兩個主要的子類,CCFiniteTimeAction和CCIntervalAction,前者是瞬時動作,后者是延時動作。 CCFollow:表示不受時間限制的動作。 CCRepeatForever:表示序列幀播放,非常常用。 CCSpeed:用于控制游戲的速度。 ### 二,CCIntervalAction常見動作 **1.移動** 移動是游戲中最常見的動作之一,如植物大戰僵尸中的僵尸,子彈等。而Cocos2d中設置移動也很簡單,看以下代碼: ~~~ CGPoint point = CGPoint.ccp(300, 150); CCSprite sprite = CCSprite.sprite("bg.img"); CCMoveTo moveTo = CCMoveTo. action(1, point); sprite.runAction(moveTo); ~~~ CGPoint.ccp就是初始化一個點,CCMoveTo.action就是就是設置sprite通過1秒的時間移動到point上。很簡單吧。最后runAction執行動作。 這里還關系到一個MoveTo和MoveBy的區別。它們的區別有兩點: * 簡單說MoveTo就是移動到絕對位置,如上面的例子就是移動到(300,150)這個坐標點,而MoveBy就是相對位置,如果當前位置是(100,0),那執行上面的代碼最終會移動到(400,150)的位置上,也就是相對當前位置的(300,150)所在的點。 * MoveBy中有一個reverse()方法,可以讓動作反向執行,而MoveTo沒有。 MoveBy的代碼與MoveTo類似: ~~~ CGPoint point = CGPoint.ccp(300, 150); CCSprite sprite = CCSprite.sprite("bg.img"); CCMoveBy moveBy = CCMoveBy. action(1, point); sprite.runAction(moveBy); ~~~ 再看看調用reverse()的情況,具體運動狀態可以看我的demo的第四棵樹。 ~~~ CGPoint point = CGPoint.ccp(300, 150); CCSprite sprite = CCSprite.sprite("bg.img"); CCMoveBy moveBy = CCMoveBy. action(1, point); <pre name="code" class="java" style="font-size: 16px; orphans: 2; widows: 2;">CCMoveBy moveBy1 = moveBy.reverse() ; sprite.runAction(moveBy); ~~~ 由于By與To的代碼很類似,下文就只貼一種類型的代碼了。不然會累死,哈哈。 **2.旋轉旋轉的實現也很簡單,與Move類似,看下代碼:** ~~~ CCRotateBy scaleBy = CCRotateBy.action(0.2f, 360);//100是順時針100度 sprite.runAction(scaleBy); ~~~ 第一個參數依然是時間,第二個參數是度數。旋轉是順時針的。可以看demo的第二棵樹。 這里By與To又有點不同,To比較懶,如果是大小180度,它會逆時間轉,它的原則是盡量少轉。By就比較老實,寫多少度,它就轉多少。 **3.縮放** 就是縮小放大這個動作,看我demo中的每一棵樹,這樹的動作并不是一次性的,而是像個心臟似的一起跳,這里就有兩個問題,如何讓放大縮小兩個動作串聯起來?如何使動作循環執行?先不急,后面會系統講解,先帶著這問題繼續往下。縮放的代碼: ~~~ CCScaleBy scaleBy = CCScaleBy.action(0.2f, 1.5f); sprite.runAction(scaleBy); ~~~ **4.跳躍** 玩過超級瑪麗的都知道,小瑪麗跳的高度和大瑪麗跳的不一樣,有些牛X的還能二連跳。其實這個實現起來也很方便,先看一連跳: ~~~ CGPoint pos = CGPoint.ccp (300, 150); // 跳躍:啟動;時間;目標點;高度:實際跳躍的高度(最高點);次數 CCJumpBy jumpBy = CCJumpBy. action(2, pos, 100, 1); CCSprite sprite = getSprite(); sprite.runAction(jumpBy); ~~~ pos指定最終跳到的點,CCJumpBy.action第一個參數是時間,第二個參數是終點,第三個參數是跳到的高度(最高點),最后一個參數是指跳的次數,由此可見,二連跳就很簡單了,只要把1修改為2就可以了。 **5.貝葉斯曲線** 這個聽起來很高端,其實就是拋物線狀。植物大戰僵尸里的花吐出的陽光就走了一條拋物線。實現如下: ~~~ CCBezierConfig c = new CCBezierConfig(); c. controlPoint_1 = CGPoint. ccp(0, 0); c. controlPoint_2 = CGPoint. ccp(150, 200); c. endPosition = CGPoint. ccp(300, 0); CCBezierBy bezierBy = CCBezierBy. action(2, c); getSprite().runAction(bezierBy); ~~~ **6.漸快漸慢動作** 這個經常用在打斗游戲中,一個怪快速跳到另一個怪身邊,殺殺,然后再跳回來,就是一個漸快到漸慢的過程。看下它的代碼: ~~~ CGPoint pos = CGPoint.ccp (300, 200); CCMoveBy moveBy = CCMoveBy. action(2, pos); CCEaseIn easeIn = CCEaseIn. action(moveBy, 10);// 漸快:加速運動(加速度恒定) CCEaseOut easeOut = (CCEaseOut) easeIn.reverse(); getSprite().runAction( CCRepeatForever.action(CCSequence.actions(easeIn, CCDelayTime. action(1), easeOut))); ~~~ 可能上面的代碼有幾處地方不懂,下面會講解。先總結下基本的運行方法: 移動動作:CCMoveBy ? CCMoveTo 縮放動作:CCScaleBy ? CCScaleTo 旋轉動作:CCRotateBy ? CCRotateTo 跳躍動作:CCJumpBy ? CCJumpTo 貝賽爾曲線動作:CCBezierBy ? CCBezierTo 淡入淡出動作:CCFadeBy ? CCFadeIn ? CCFadeOut ### 三,組合動作 上部分分個講了一些常見的動作,但真實游戲實現單個動作的比較少,一般都是串在一起實現的。所以組合動作再所難免。先來看幾個常用的接口: CCSequence:用于將多個動作串聯到一起。 CCRepeatForever:用于把一個動作循環執行。 CCDelayTime:設置延時時間。 CCSpawn:并行執行動畫。 看到這,上面心跳的那個例子就可以實現了,如下: ~~~ CCScaleBy scaleBy = CCScaleBy.action(0.2f, 1.5f); CCSequence ccSequence = CCSequence. actions(scaleBy, scaleBy.reverse()); CCRepeatForever ccRepeatForever = CCRepeatForever.action(ccSequence); sprite.runAction(ccRepeatForever); ~~~ 接下來我們用以上幾個接口來共同實現一個復雜動作,一棵樹翻兩個跟斗,具體可以看demo的第三棵樹。先看代碼: ~~~ // 跳躍:啟動;時間;目標點;高度:實際跳躍的高度(最高點);次數 CCJumpBy jumpBy = CCJumpBy. action(2, pos, 100, 2); CCRotateBy scaleBy = CCRotateBy. action(0.2f, 100);//100是順時針100度 //并行執行動畫 CCSpawn ccSpawn = CCSpawn. actions(jumpBy, scaleBy); //每循環一次停一秒 CCSequence ccSequence = CCSequence. actions(ccSpawn, ccSpawn.reverse(),CCDelayTime.action(1)); CCRepeatForever ccRepeatForever = CCRepeatForever.action(ccSequence); sprite.setAnchorPoint(0.5F, 0.5F); sprite.runAction(ccRepeatForever); ~~~ CCSpawn讓跳和旋轉兩個動作同時執行,然后調用CCSequence再串聯一個回來的動作,調用CCDelayTime停一秒后,再經CCRepeatForever繼續循環執行動作。 到此已經可以完成很多復雜的動畫了。在這里問一個問題,如果我想在某個動作結束后執行某個方法,該怎辦?這里要強調的是,動畫的執行是在多線程的,所以你直接把方法寫在動作后面是行不通的。所以要通過CCCallFunc.action(this, "loadInfo")來調用自定義的方法,這里的方法名是loadInfo。代碼如下: ~~~ CCSequence sequence = CCSequence.actions(CCDelayTime.action(1), CCCallFunc.action(this, "loadInfo")); sprite.runAction(sequence); ~~~ 這是1秒后執行loadInfo方法。 ### 四 序列幀播放 什么時序列幀?就是一系列的圖片連到一起組成一個動話,就叫序列幀。如一只怪的頭點一下,就要有好幾張圖片串起來實現它的頭慢慢下降。先看例子再進行講解: ~~~ CCSprite bar = CCSprite.sprite("image/loading/loading_01.png"); bar.setAnchorPoint( cgSize. width/2, 25); this.addChild(bar); //以下是序列幀 List<CCSpriteFrame> frames = new ArrayList<CCSpriteFrame>(); String fileName = "image/loading/loading_%02d.png" ;//用占位符表示圖片尾部,格式為兩位數,如01,11。 for( int i = 1 ;i <= 9;i++){ CCSprite frame = CCSprite.sprite(String.format(fileName, i)); frames.add(frame.displayedFrame()); } CCAnimation animation = CCAnimation. animation("", 0.2f,(ArrayList<CCSpriteFrame>)frames); CCAnimate animate = CCAnimate.action(animation,false);//false表示只加載一次 bar.runAction(animate); ~~~ 首先加載初始狀態。把一系列的精靈轉成CCSpriteFrame格式的轉入到CCAnimation中,它就會自動播放。fileName中的%2d是規定了兩位,d是點位符,傳什么數進來就顯示什么。比如,傳1,就顯示01,傳11就顯示11。最后CCAnmate.action中的false表示只加載一次,即動畫只執行一次。如果要循環執行,就把它改為true。 到這里,基礎知識就介紹的差不多了,可以嘗試去玩下植物大戰僵尸,代碼在上一篇博客中提供了。 源碼下載
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看