閱讀604 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Cocos2dx 3.0 過渡篇(十三) action的用法從一個故事說起

本篇博客來自star特530,轉載請注明出處。https://blog.csdn.net/start530/article/details/20153367
-------------
動作到底該怎麼玩?說的也就是runAction這貨了。
如果你覺得本文還是在寫像MoveTo,SacleTo這類動作的用法的話,那你就錯了。那樣不夠厚道。當然了,像Sequence,Spawn這類的東西多少也是會涉及到一點的。那到底要寫什麼呢?我們的故事從這裏開始。

首先我們創建倆精靈,就命名為boy 和 girl 吧。

  1. auto size = Director::getInstance()->getWinSize();  
  2.     
  3. auto boy = Sprite::create("boy.png");  
  4. boy->setPosition(Point(0,size.height/2));//將boy的位置設置在最左邊  
  5. this->addChild(boy,1);  
  6.   
  7. auto girl = Sprite::create("girl.png");  
  8. girl->setPosition(Point(size.width,size.height/2));//將girl的位置設置在最右邊  
  9. this->addChild(girl,1);  

(故事的開始,boy 和 girl互相都不認識,直到有一天,倆人相遇了)
boy 和 girl 同時運動到場景中間

  1. boy->runAction(MoveTo::create(1.0f,Point(size.width/2-20,size.height/2)));//boy的速度明顯比girl的快。  
  2. girl->runAction(MoveTo::create(1.5f,Point(size.width/2 +10,size.height/2)));  

(boy看到girl的那一刻,驚呆了。他知道,她就是他一直在尋找的那個人。這,就是一見鍾情)
boy用原地旋轉360 + 全身血液膨脹來表達他的激動心情。表現方式有兩種:

  1. //1、邊旋轉邊全身膨脹  
  2. boy->runAction(Spawn::create(RotateBy::create(1.0f,360),ScaleTo::create(1.0f,1.2f),NULL));  
  3.   
  4. //2、先旋轉完再全身膨脹  
  5. boy->runAction(Sequence::create(RotateBy::create(1.0f,360),ScaleTo::create(1.0f,1.2f),NULL));  
(girl 看到 膨脹後的 boy,不禁覺得 boy好是高大威風(吐槽!),於是芳心暗許)
這裏表現的動作就是 girl要在boy旋轉+放大的動作做完後,才表現出她的...額,她的什麼來著?對了,女的比較活潑,應該跳起來。恩,於是girl跳了起來。

  1. //這裏的重點是girl應該怎樣才能在boy做完action後執行她的動作呢?有以下幾種辦法  
  2. //1、用延遲的DelayTime來實現,也就是boy運動完後延遲幾秒,然後讓girl運動  
  3.   
  4. //延遲2.5s,用1s時間跳了3次,跳躍高度100像素,並且向右移動了30像素  
  5. girl->runAction(Sequence::create(DelayTime::create(2.5f),JumpBy::create(1.0f,Point(30,0),100,3),NULL));  
  6.   
  7.   
  8. //2、用回調函數實現,當boy完成後,寫一個lambda表達式來實現girl要做的動作(lambda表達式的使用可以參考我上一篇博客)  
  9.   
  10. boy->runAction(Sequence::create(RotateBy::create(1.0f,360),ScaleTo::create(1.0f,1.2f),  
  11.         CallFunc::create([=]()  
  12.         {  
  13.             //用1s時間跳了3次,跳躍高度100像素,並且向右移動了30像素  
  14.             girl->runAction(JumpBy::create(1.0f,Point(30,0),100,3));  
  15.         }),NULL));  
  16.   
  17.           
  18. //3、用現成的接口TargetedAction();  
  19.   
  20. auto jump = JumpBy::create(1.0f,Point(30,0),100,3);//先寫一個跳躍的動作  
  21. auto targetAct = TargetedAction::create(girl,jump);//寫一個目標動作,將動作執行人girl和要執行的動作jump放入其中  
  22. //將girl的目標動作放入boy的sequence裏去  
  23. boy->runAction(Sequence::create(RotateBy::create(1.0f,360),ScaleTo::create(1.0f,1.2f),targetAct,NULL));    
(最後的劇情就是倆人很快的就在一起了,雖然認識時間不長,但他倆有足夠的時間來認識對方,了解對方。用四年的時間來證明自己的眼光是對的)
有情人終成眷屬,故事的最後,允許我用一顆閃爍的心來表達對他們的祝福。希望他們能永遠在一起!!!

  1. //創建逐幀動畫          
  2. auto spriteFrameCache = SpriteFrameCache::sharedSpriteFrameCache();    
  3. spriteFrameCache->addSpriteFramesWithFile("heart.plist");  //將動畫圖片的plist放入緩存中  
  4.   
  5. SpriteFrame* frame = NULL;  
  6. auto frameArray = Array::create();  
  7.   
  8. for(int i=0;i<10;i++)  
  9. {  
  10.     frame = spriteFrameCache->spriteFrameByName(CCString::createWithFormat("%s%d.png","heart",i)->getCString());  
  11.     frameArray->addObject(frame);  
  12. }  
  13.   
  14. auto animation = Animation::createWithSpriteFrames(frameArray,0.15f);  
  15. auto animate = Animate::create(animation);//創建一個動畫  
  16.   
  17. auto heard_sp = Sprite::create("heart.png");  
  18. heard_sp->setPosition(Point(size.width/2,size.height-200));  
  19. heard_sp->runAction(animate);//播放動畫  
  20. this->addChild(heard_sp,2);  

故事簡單,過程卻沒那麼容易,結局也沒想象的那麼美好。




本篇博客來自star特530,轉載請注明出處。https://blog.csdn.net/start530/article/details/20153367

最後更新:2017-04-03 12:56:12

  上一篇:go windows常用 API函數
  下一篇:go Linux上安裝配置InstantClient及64位係統Pl/SQL配置