cocos2d-x 3.2 扇形按钮

转自:http://blog.csdn.net/qhg2014/article/details/38802611

HelloWorld.h

  1. #ifndef __HELLOWORLD_SCENE_H__  
  2. #define __HELLOWORLD_SCENE_H__  
  3.   
  4. #include "cocos2d.h"  
  5.   
  6. class HelloWorld : public cocos2d::Layer  
  7. {  
  8. private:  
  9.     cocos2d::MenuItemSprite* menuItem;  
  10.     cocos2d::MenuItemSprite* menuItem1;  
  11.     cocos2d::MenuItemSprite* menuItem2;  
  12.     cocos2d::MenuItemSprite* menuItem3;  
  13.     cocos2d::MenuItemSprite* menuItem4;  
  14.     cocos2d::MenuItemSprite* menuItem5;  
  15.     cocos2d::Menu* menu;  
  16.     bool isShow;  
  17. public:  
  18.     // there's no 'id' in cpp, so we recommend returning the class instance pointer  
  19.     static cocos2d::Scene* createScene();  
  20.   
  21.     // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone  
  22.     virtual bool init();    
  23.       
  24.     // implement the "static create()" method manually  
  25.     CREATE_FUNC(HelloWorld);  
  26.   
  27.     void btnCallback(cocos2d::Ref* pSender);  
  28.     void btnCallback1(cocos2d::Ref* pSender);  
  29.     void btnCallback2(cocos2d::Ref* pSender);  
  30.     void btnCallback3(cocos2d::Ref* pSender);  
  31.     void btnCallback4(cocos2d::Ref* pSender);  
  32.     void btnCallback5(cocos2d::Ref* pSender);  
  33.     void enabledCallback(cocos2d::Ref* pSender);  
  34.   
  35.     cocos2d::ActionInterval* spawnOut(cocos2d::Vec2 point, float duration);  
  36.     cocos2d::ActionInterval* spawnIn(float duration);  
  37. };  
  38.   
  39. #endif // __HELLOWORLD_SCENE_H__  



HelloWorld.cpp

  1. #include "HelloWorldScene.h"  
  2.   
  3. USING_NS_CC;  
  4.   
  5. Scene* HelloWorld::createScene()  
  6. {  
  7.     // 'scene' is an autorelease object  
  8.     auto scene = Scene::create();  
  9.   
  10.     // 'layer' is an autorelease object  
  11.     auto layer = HelloWorld::create();  
  12.   
  13.     // add layer as a child to scene  
  14.     scene->addChild(layer);  
  15.   
  16.     // return the scene  
  17.     return scene;  
  18. }  
  19.   
  20. // on "init" you need to initialize your instance  
  21. bool HelloWorld::init()  
  22. {  
  23.     //  
  24.     // 1. super init first  
  25.     if (!Layer::init())  
  26.     {  
  27.         return false;  
  28.     }  
  29.   
  30.     isShow = false;  
  31.   
  32.     SpriteFrameCache::getInstance()->addSpriteFramesWithFile("button.plist");  
  33.   
  34.     menuItem = MenuItemSprite::create(  
  35.         Sprite::createWithSpriteFrameName("btn.png"),  
  36.         Sprite::createWithSpriteFrameName("btn.png"),  
  37.         CC_CALLBACK_1(HelloWorld::btnCallback, this)  
  38.         );  
  39.     //menuItem->setTag(1000);  
  40.     menuItem->setPosition(Vec2(200, 200));  
  41.   
  42.     menuItem1 = MenuItemSprite::create(  
  43.         Sprite::createWithSpriteFrameName("btn1.png"),  
  44.         Sprite::createWithSpriteFrameName("btn1.png"),  
  45.         CC_CALLBACK_1(HelloWorld::btnCallback1, this)  
  46.         );  
  47.     //menuItem1->setTag(1001);  
  48.     //menuItem1->setRotation(-360);  
  49.     //menuItem1->setPosition(200, 400);  
  50.     menuItem1->setPosition(Vec2(200, 200));  
  51.   
  52.     menuItem2 = MenuItemSprite::create(  
  53.         Sprite::createWithSpriteFrameName("btn2.png"),  
  54.         Sprite::createWithSpriteFrameName("btn2.png"),  
  55.         CC_CALLBACK_1(HelloWorld::btnCallback1, this)  
  56.         );  
  57.     //menuItem2->setTag(1002);  
  58.     //menuItem2->setPosition(270, 370);  
  59.     menuItem2->setPosition(Vec2(200, 200));  
  60.   
  61.     menuItem3 = MenuItemSprite::create(  
  62.         Sprite::createWithSpriteFrameName("btn3.png"),  
  63.         Sprite::createWithSpriteFrameName("btn3.png"),  
  64.         CC_CALLBACK_1(HelloWorld::btnCallback1, this)  
  65.         );  
  66.     //menuItem3->setTag(1003);  
  67.     //menuItem3->setPosition(330, 330);  
  68.     menuItem3->setPosition(Vec2(200, 200));  
  69.   
  70.     menuItem4 = MenuItemSprite::create(  
  71.         Sprite::createWithSpriteFrameName("btn4.png"),  
  72.         Sprite::createWithSpriteFrameName("btn4.png"),  
  73.         CC_CALLBACK_1(HelloWorld::btnCallback1, this)  
  74.         );  
  75.     //menuItem4->setTag(1004);  
  76.     //menuItem4->setPosition(370, 270);  
  77.     menuItem4->setPosition(Vec2(200, 200));  
  78.   
  79.     menuItem5 = MenuItemSprite::create(  
  80.         Sprite::createWithSpriteFrameName("btn5.png"),  
  81.         Sprite::createWithSpriteFrameName("btn5.png"),  
  82.         CC_CALLBACK_1(HelloWorld::btnCallback1, this)  
  83.         );  
  84.     //menuItem5->setTag(1005);  
  85.     //menuItem5->setPosition(400, 200);  
  86.     menuItem5->setPosition(Vec2(200, 200));  
  87.   
  88.     menu = Menu::create(menuItem1, menuItem2, menuItem3, menuItem4, menuItem5, menuItem, NULL);  
  89.     //mn->setTag(1100);  
  90.     menu->setPosition(Vec2::ZERO);  
  91.     this->addChild(menu, 10);  
  92.   
  93.   
  94.     return true;  
  95. }  
  96.   
  97. void HelloWorld::btnCallback(Ref* pSender)  
  98. {  
  99.     FiniteTimeAction* acf = (FiniteTimeAction*)CallFuncN::create(CC_CALLBACK_1(HelloWorld::enabledCallback, this));  
  100.     if (isShow)  
  101.     {  
  102.         menuItem->runAction(RotateTo::create(0.3f, -720));  
  103.         menuItem1->runAction(HelloWorld::spawnIn(0.6f));  
  104.         menuItem2->runAction(HelloWorld::spawnIn(0.65f));  
  105.         menuItem3->runAction(HelloWorld::spawnIn(0.7f));  
  106.         menuItem4->runAction(HelloWorld::spawnIn(0.75f));  
  107.         //menuItem5->runAction(HelloWorld::spawnIn(0.8f));  
  108.         menuItem5->runAction(Sequence::create(HelloWorld::spawnIn(0.8f), acf, nullptr));  
  109.     }  
  110.     else  
  111.     {  
  112.         menuItem->runAction(RotateTo::create(0.3f, 720));  
  113.         menuItem1->runAction(HelloWorld::spawnOut(Vec2(200, 400), 0.6f));  
  114.         menuItem2->runAction(HelloWorld::spawnOut(Vec2(270, 370), 0.65f));  
  115.         menuItem3->runAction(HelloWorld::spawnOut(Vec2(330, 330), 0.7f));  
  116.         menuItem4->runAction(HelloWorld::spawnOut(Vec2(370, 270), 0.75f));  
  117.         //menuItem5->runAction(HelloWorld::spawnOut(Vec2(400, 200), 0.8f));  
  118.         menuItem5->runAction(Sequence::create(HelloWorld::spawnOut(Vec2(400, 200), 0.8f), acf, nullptr));  
  119.     }  
  120.   
  121.     isShow = !isShow;  
  122.     menu->setEnabled(false);  
  123. }  
  124.   
  125. ActionInterval* HelloWorld::spawnIn(float duration)  
  126. {  
  127.     ActionInterval* rotateTo = RotateTo::create(duration, -1080);  
  128.     auto move_ease_in = EaseBackIn::create(MoveTo::create(duration, Vec2(200, 200)));  
  129.     return Spawn::create(move_ease_in, rotateTo, nullptr);  
  130. }  
  131.   
  132. ActionInterval* HelloWorld::spawnOut(Vec2 point, float duration)  
  133. {  
  134.     //auto delay = DelayTime::create(1);  
  135.     ActionInterval* rotateTo = RotateTo::create(duration, 1080);  
  136.     auto move_ease_out = EaseBackOut::create(MoveTo::create(duration, point));  
  137.     return Spawn::create(move_ease_out, rotateTo, nullptr);  
  138. }  
  139.   
  140. void HelloWorld::btnCallback1(Ref* pSender)  
  141. {}  
  142. void HelloWorld::btnCallback2(Ref* pSender)  
  143. {}  
  144. void HelloWorld::btnCallback3(Ref* pSender)  
  145. {}  
  146. void HelloWorld::btnCallback4(Ref* pSender)  
  147. {}  
  148. void HelloWorld::btnCallback5(Ref* pSender)  
  149. {}  
  150. void HelloWorld::enabledCallback(Ref* pSender)  
  151. {  
  152.     menu->setEnabled(true);  
  153. }  



回弹的效果主要参考了cpp-tests里的ActionsEaseTest.cpp

  1. //------------------------------------------------------------------  
  2. //  
  3. // SpriteEaseBack  
  4. //  
  5. //------------------------------------------------------------------  
  6.   
  7. void SpriteEaseBack::onEnter()  
  8. {  
  9.     EaseSpriteDemo::onEnter();  
  10.       
  11.     auto move = MoveBy::create(3, Vec2(VisibleRect::right().x-130, 0));  
  12.     auto move_back = move->reverse();  
  13.       
  14.     auto move_ease_in = EaseBackIn::create(move->clone());  
  15.     auto move_ease_in_back = move_ease_in->reverse();  
  16.       
  17.     auto move_ease_out = EaseBackOut::create( move->clone());  
  18.     auto move_ease_out_back = move_ease_out->reverse();  
  19.       
  20.     auto delay = DelayTime::create(0.25f);  
  21.       
  22.     auto seq1 = Sequence::create(move, delay, move_back, delay->clone(), nullptr);  
  23.     auto seq2 = Sequence::create(move_ease_in, delay->clone(), move_ease_in_back, delay->clone(), nullptr);  
  24.     auto seq3 = Sequence::create(move_ease_out, delay->clone(), move_ease_out_back, delay->clone(), nullptr);  
  25.       
  26.     _grossini->runAction(RepeatForever::create(seq1));  
  27.     _tamara->runAction(RepeatForever::create(seq2));  
  28.     _kathia->runAction(RepeatForever::create(seq3));      
  29. }  

增加了控制连续点击按钮导致动作不能执行完的问题。

最初是用了一个变量来控制,可能哪里没设置好导致控制不完美,感谢cocoachina的版主指出使用menu->setEnabled(false);

效果图:


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值