cocos2d-x学习记录6——自定义Button

时间:2023-02-06 19:21:50

cocos2d-x中封装CCMenuItem等相关按钮,但是有些时候需要自己封装按钮,这样能够更加灵活的实现对应功能。

自定义Button,需要重写OnEnter()和onExit()函数,并在对应函数中添加注册和取消注册。

BaseButton.h内容

 1 #ifndef BaseButton_H_H
 2 #define BaseButton_H_H
 3 
 4 #include "cocos2d.h"
 5 using namespace cocos2d;
 6 
 7 typedef SEL_CallFunc v_callback;
 8 
 9 class BaseButton : public CCNodeRGBA, public CCTargetedTouchDelegate
10 {
11 public:
12     BaseButton() : sprite1(NULL), sprite2(NULL), curSprite(NULL), downCallback(NULL), moveCallback(NULL), upCallback(NULL) {}
13     static BaseButton* create(const char* pszFileName1, const char* pszFileName2, v_callback upCallback0);
14     virtual bool initWithFile(const char* pszFileName1, const char* pszFileName2, v_callback upCallback0);
15 
16     virtual void onEnter();
17     virtual void onExit();
18     
19     virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
20     virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);
21     virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);
22     //virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent);
23 
24     void downHand();
25 
26     virtual void update();
27 
28 private:
29     CCSprite *sprite1, *sprite2, *curSprite;
30     //vCallback downCallback, moveCallback, upCallback; 
31     //void (*downCallback)(void);
32     void (*moveCallback)(void);
33     //void (*upCallback)(void);
34     v_callback downCallback;
35     v_callback upCallback;
36 };
37 
38 #endif

BaseButton.cpp内容

 1 #include "BaseButton.h"
 2 
 3 BaseButton* BaseButton::create(const char* pszFileName1, const char* pszFileName2, v_callback upCallback0)
 4 {
 5     BaseButton *button = new BaseButton();
 6     if(button && button->initWithFile(pszFileName1, pszFileName2, upCallback0)){
 7         button->autorelease();
 8         return button;
 9     }
10     CC_SAFE_DELETE(button);
11     return NULL;
12 }
13 
14 bool BaseButton::initWithFile(const char* pszFileName1, const char* pszFileName2, v_callback upCallback0)
15 {
16     if( !CCNodeRGBA::init() ){
17         return false;
18     }
19     if(pszFileName1 == NULL){
20         return false;
21     }
22 
23     sprite1 = CCSprite::create( pszFileName1 );
24     CCSize size = sprite1->getContentSize();
25     if(pszFileName2 != NULL){
26         sprite2 = CCSprite::create( pszFileName2 );
27     }
28     else{
29         sprite2 = CCSprite::create( pszFileName1 );
30         sprite2->setColor( ccc3(0, 0, 0) );
31         sprite2->setOpacity( (GLubyte)(255*0.7) );
32     }
33     sprite2->setVisible(false);
34     sprite2->setScaleX(size.width/sprite2->getContentSize().width);
35     sprite2->setScaleY(size.height/sprite2->getContentSize().height);
36     addChild(sprite1);
37     addChild(sprite2);
38     curSprite = sprite1;
39 
40     downCallback = (SEL_CallFunc)(&BaseButton::downHand);
41     upCallback = upCallback0;
42 
43     scheduleUpdate();
44 
45     return true;
46 }
47 
48 void BaseButton::onEnter()
49 {
50     CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, true);
51 }
52 
53 void BaseButton::onExit()
54 {
55     CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
56 }
57 
58 bool BaseButton::ccTouchBegan(CCTouch* pTouch, CCEvent *pEvent)
59 {
60     //CCPoint point = pTouch->getLocation();
61     CCPoint point = this->convertTouchToNodeSpaceAR(pTouch);
62     if( sprite1->boundingBox().containsPoint(point) ){
63         if(downCallback != NULL){
64             (this->*downCallback)();
65         }
66         return true;
67     }
68     return false;
69 }
70 
71 void BaseButton::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent)
72 {
73     if(moveCallback != NULL){
74         moveCallback();
75     }
76 }
77 
78 void BaseButton::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)
79 {
80     sprite2->setVisible(false);
81     sprite1->setVisible(true);
82     if(upCallback != NULL){
83         //upCallback();
84         (this->*upCallback)();
85     }
86     //CCMessageBox("Up", "Info");
87 }
88 
89 void BaseButton::downHand()
90 {
91     sprite1->setVisible(false);
92     sprite2->setVisible(true);
93 }
94 
95 void BaseButton::update()
96 {
97 
98 }

MyScene.h内容

 1 #ifndef MyScene_H_H
 2 #define MyScene_H_H
 3 
 4 #include "cocos2d.h"
 5 using namespace cocos2d;
 6 
 7 
 8 
 9 class MyScene : public CCLayer
10 {
11 public:
12     static CCScene* createScene();
13     virtual bool init();
14     CREATE_FUNC( MyScene );
15 
16     void upCallback();
17 
18 
19 private:
20 };
21 
22 
23 #endif

MyScene.cpp内容

 1 #include "MyScene.h"
 2 #include "BaseButton.h"
 3 
 4 
 5 CCScene* MyScene::createScene()
 6 {
 7     CCScene *scene = CCScene::create();
 8     MyScene *layer = MyScene::create();
 9     scene->addChild(layer);
10     return scene;
11 };
12 
13 
14 bool MyScene::init()
15 {
16     if( !CCLayer::init() ){
17         return false;
18     }
19 
20     CCSize size = CCDirector::sharedDirector()->getWinSize();
21 
22     BaseButton *button = BaseButton::create("pal_2.png", "pal_3.png", (v_callback)(&MyScene::upCallback1) );
23     button->setAnchorPoint(ccp(0.5, 0.5));
24     button->setPosition(100, size.height/2);
25     button->setScale(0.25f);
26     addChild(button);
27 
28     BaseButton *button2 = BaseButton::create("pal_2.png", "pal_3.png", (v_callback)(&MyScene::upCallback2) );
29     button2->setAnchorPoint(ccp(0.5, 0.5));
30     button2->setPosition(300, size.height/2);
31     button2->setScale(0.25f);
32     addChild(button2);
33 
34 
35     return true;
36 }
37 
38 void MyScene::upCallback1()
39 {
40     CCMessageBox("Up1", "Info");
41 }
42 
43 void MyScene::upCallback2()
44 {
45     CCMessageBox("Up2", "Info");
46 }

运行结果:

cocos2d-x学习记录6——自定义Button

这里的button响应函数使用的是成员函数指针,需要通过对象进行使用,如(this->*upCallback)()。

而普通的函数指针则需要是static函数,成员函数则会出现错误。