Cocoa學習筆記 Cocos2d 各種動作介紹 (下)

Cocoa學習筆記 Cocos2d 各種動作介紹 (上)是本節介紹的內容,繼續Cocoa學習筆記 Cocos2d 各種動作介紹 (上)的內容開始介紹。我們先來看內容。

重複有限次數 – Repeate

重複有限的次數的動作示例代碼如下:

  1.  (void) OnRepeat:(id) sender {    
  2.  CGSize s = [[CCDirector sharedDirector] winSize];     
  3.  CGPoint p = ccp(s.width/2, 50);    
  4.  sprite.rotation = 0;     
  5.  [sprite setPosition:p];    
  6.  // 創建動作序列    
  7.  id ac1 = [CCMoveTo actionWithDuration:2 position:ccp(s.width - 50, s.height - 50)];    
  8. id ac2 = [CCJumpBy actionWithDuration:2 position:ccp(-400, -200) height:30 jumps:5];    
  9. id ac3 = [CCJumpBy actionWithDuration:2 position:ccp(s.width/2, 0) height:20 jumps:3];    
  10.  id seq = [CCSequence actions:ac1, ac2, ac3, nil];    
  11.  //重複運行上述勱作序列 3 次。    
  12.  [sprite runAction:[CCRepeat actionWithAction:seq times:3]];    
  13. }  

反動作 – Reverse

反動作就是反向(逆向)執行某個動作,支持針對動作序列的反動作序列。反動作不是一個專門的類,而是 CCFiniteAction 引入的一個接口。不是所有的類都支持反動作,XxxxTo 類通常不支持反動作,XxxxBy 類通常支持。示例如下:

  1. (void) OnReverse:(id) sender {    
  2.  CGSize s = [[CCDirector sharedDirector] winSize];     
  3.  CGPoint p = ccp(s.width/2, 50);    
  4.  sprite.rotation = 0;     
  5.  [sprite setPosition:p];    
  6.  id ac1 = [CCMoveBy actionWithDuration:2 position:ccp(190, 220)];    
  7. // 創建某個勱作癿反勱作。    
  8.  id ac2 = [ac1 reverse];    
  9.  [sprite runAction:[CCRepeat actionWithAction:[CCSequence actions:ac1, ac2,nil] times:2]];    
  10. }   
  11.  
  12. 動畫 – Animation  
  13.  
  14. 動畫就是讓精靈自身的連續執行一段影像,形成模擬運動的效果:行走時動精靈狀態、打鬥時的狀態等。  
  15.  
  16.  (void) OnAnimation:(id) sender {    
  17.  
  18. CCAnimation *animation = [AtlasAnimation animationWithName:@"flight" delay:0.2f];    
  19.  // 每幀的內容定義。     
  20. for(int i=0;i<3;i++) {    
  21.  int xi % 3;     
  22.  [animation addFrameWithRect: CGRectMake(x*32, 0, 31,30) ];     
  23.  }    
  24. // 執行勱畫效果     
  25.  id action = [CCAnimate actionWithAnimation: animation];     
  26. [sprite runAction:[CCRepeat actionWithAction:action times:10]];    
  27.  }   
  28.  
  29. 無限重複 – RepeatForever   
  30.  
  31. RepeatForever 是從 Action 類直接派生的,因此無法參於序列和同步;自身也無法反向執行。該類的作用就是無限期執行某個動作或動作序列,直到被停止。  
  32.  
  33.  (void) OnRepeatForever:(id) sender {    
  34.  CGSize s = [[Director sharedDirector] winSize];     
  35.  CGPoint p = ccp(100, 50);    
  36. // 飛行噴火模擬勱畫    
  37.  CCAnimation *animation = [CCAnimation animationWithName:@"flight" delay:0.1f];    
  38.  for(int i=0;i<3;i++)     
  39.  {    
  40.  int xi % 3;    
  41.  [animation addFrameWithRect: CGRectMake(x*32, 0, 31,30) ];     
  42.  }    
  43.  id action = [CCAnimate actionWithAnimation: animation];    
  44.  // 將該動畫作爲精靈的本徵動畫,一直運行。    
  45.  [sprite runAction:[RepeatForever actionWithAction:action]];    
  46. // 在創建第二個連續無限期動作序列。疊加二者形成完整效果。     
  47. ccBezierConfig bezier;    
  48.  sprite.rotation = 0;     
  49.  [sprite setPosition:p];    
  50.  bezier.startPosition = ccp(0,0);     
  51.  bezier.controlPoint_1 = ccp(0, s.height/2);     
  52.  bezier.controlPoint_2 = ccp(300, -s.height/2);     
  53.  bezier.endPosition = ccp(300,100);    
  54.  id ac10 = [CCBezierBy actionWithDuration:3 bezier:bezier];    
  55.  id ac11 = [CCTintBy actionWithDuration:0.5 red:0 green:255 blue:255];    
  56.  id ac1 = [CCSpawn actions:ac10, [Repeat actionWithAction:ac11 times:4], nil];    
  57.  id ac2 = [CCSpawn actions:[ac10 reverse], [CCRepeat actionWithAction:ac11 times:4], nil];    
  58.  // 第二個無限期連續運勱。    
  59.  [sprite runAction:[CCRepeatForever actionWithAction:[CCSequence actions:ac1, ac2,nil]]];    
  60.  }  

速度變化

基本動作和組合動作實現了針對精靈的各種運動、動畫效果的改變,但這樣的改變的速度是不變的,通過 CCEaseAction 爲基類的類系和 CCSpeed 類我們可以很方便的修改精靈執行動作的速度:由快至慢還是由慢至快

EaseIn 由慢至快。

EaseOut 由快至慢

EaseInOut 由慢至快再由快至慢。

EaseSineIn 由慢至快

EaseSineOut 由快至慢

EaseSineInOut 由慢至快再由快至慢。

EaseExponentialIn 由慢至極快。

EaseExponentialOut 由極快至慢。

EaseExponentialInOut 由慢至極快再由極快至慢。

Speed 人工設定速度,還可通過 SetSpeed 不斷調整。

擴展動作

我們已經掌握了執行各種各樣的動作,也可以按照不同的快慢修改動作執行的時間, Cocos2D-iPhone 還提供了針對現有動作的擴展,以實現各種靈活的效果。

延時動作 – Delay在動作序列中增加一個時間間歇:

  1. (void) OnDelay:(id) sender {    
  2.  id ac1 = [CCMoveBy actionWithDuration:2 position:ccp(200, 200)];    
  3.  id ac2 = [ac1 reverse];    
  4. // 實現一個等待間歇    
  5. [spriterunAction:[Sequenceactions:ac1,[DelayTime actionWithDuration:1], ac2, nil]];     
  6. }  

函數調用 

函數在動作序列中間或者結束調用某個函數,執行任何需要執行的任務:動作、狀態修改等。代碼如下:

  1. (void) OnCallFunc:(id) sender {    
  2. id ac1 = [CCMoveBy actionWithDuration:2 position:ccp(200, 200)];    
  3. id ac2 = [ac1 reverse];    
  4. id acf = [CCCallFunc actionWithTarget:self selector:@selector(CallBack1)];    
  5. [sprite runAction:[CCSequence actions:ac1, acf, ac2, nil]];    
  6. }  

對應的函數爲:(再做一個動作,這就實現了動作、動作序列的任意擴展和連接)

  1. (void) CallBack1 {    
  2.  [sprite runAction:[CCTintBy actionWithDuration:0.5 red:255 green:0 blue:255]];     
  3.  }  

帶對象參數 調用自定義函數時,傳遞當前對象。

  1. (void) OnCallFuncN:(id) sender {    
  2.  id ac1 = [CCMoveBy actionWithDuration:2 position:ccp(200, 200)];    
  3.  id ac2 = [ac1 reverse];    
  4. id acf = [CallFuncN actionWithTarget:self selector:@selector(CallBack2:)];    
  5.  [sprite runAction:[CCSequence actions:ac1, acf, ac2, nil]];    
  6.  }  

對應的自定義函數:(這裏,我們直接使用了該對象)

  1. (void) CallBack2:(id)sender {    
  2.  [sender runAction:[CCTintBy actionWithDuration:1 red:255 green:0 blue:255]];     
  3. }  

帶對象、數據參數調用自定義函數時,傳遞當前對象和一個常量(也可以是指針)。

  1. (void) OnCallFuncND:(id) sender {    
  2.  id ac1 = [CCMoveBy actionWithDuration:2 position:ccp(200, 200)];    
  3.  id ac2 = [ac1 reverse];    
  4.  id acf = [CCCallFuncND actionWithTarget:self selector:@selector(CallBack3:data:) data:(void*)2];    
  5.  [sprite runAction:[CCSequence actions:ac1, acf, ac2, nil]];    
  6.  }  

對應的自定義函數,我們使用了傳遞的對象和數據:

  1. (void) CallBack3:(id)sender data:(void*)data {    
  2. [sender runAction:[CCTintBy actionWithDuration:(NSInteger)data red:255 green:0 blue:255]]; }  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章