上一篇我們主要講了Cocos2d_android一些布置游戲場景的知識,這一篇重點講下Cocos2d_android的事件觸發,沒看過上一篇的可以先去看下。
[Cocos2d_android你所需要知道的一切](http://blog.csdn.net/u014486880/article/details/50418485)
對于本章我做了個demo,完成各種動畫。先看下效果圖。

點擊不同的圣誕樹會有不同的動畫。因為屏幕有限演示的動畫有限,但實現思路都是一樣的。
### 一,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。
到這里,基礎知識就介紹的差不多了,可以嘗試去玩下植物大戰僵尸,代碼在上一篇博客中提供了。
源碼下載
- 前言
- Android底部tab與標題欄相結合
- Android免費獲取短信驗證碼
- android中Handler的源碼分析
- 詳解Fragment的傳值問題
- 詳談gson解析
- android新控件之toolbar,floatingActionButton,SnackBar,CollapsingToolbarLayout
- android自定義控件
- 淺談android的線程池
- Android的消息處理機制,AsyncTask源碼解析
- IPC——android進程間通信
- CoCos2d_android入門所需知道的一切
- Cocos2d_android你所需要知道的一切(下)
- Activity你需要知道的一切
- Activity啟動過程源碼分析
- Data Binding Guide——google官方文檔翻譯(上)
- Data Binding Guide——google官方文檔翻譯(下)
- android TextView實現跑馬燈效果
- android中生成excel
- Volley源碼解析
- LayoutInflater源碼解析
- android發送郵件
- android測試工具MonkeyRunner--google官網翻譯
- android View繪制源碼分析
- Android中Window添加View的底層原理
- 仿美團商品選購下拉菜單實現