cocos2dx 按钮各种事件

2015年02月26日 10:31 0 点赞 0 评论 更新于 2025-11-21 16:20

本文基于 Cocos2d-x 2.2.2 版本,详细介绍 Cocos2d-x 中按钮的各种事件。

1. 头文件包含

Cocos2d-x 的按钮类定义在 extensions\\GUI\\CCControlExtension\\CCControlButton.h 中。在需要使用按钮的地方,需要包含以下三个头文件:

#include "GUI/CCControlExtension/CCControlButton.h"
#include "GUI/CCControlExtension/CCScale9Sprite.h"
#include "GUI/CCControlExtension/CCControl.h"

2. 按钮事件定义

按钮的事件通过枚举类型进行定义,具体如下:

enum
{
CCControlEventTouchDown           = 1 << 0,     //  一个触摸按下事件,手指在控件范围内按下
CCControlEventTouchDragInside     = 1 << 1,     //  手指在控件范围内拖动的事件
CCControlEventTouchDragOutside    = 1 << 2,     //  手指从控件范围内拖动到控件范围外的事件
CCControlEventTouchDragEnter      = 1 << 3,     //  手指从控件范围外拖动进入控件范围内的事件
CCControlEventTouchDragExit       = 1 << 4,     //  手指从控件范围内拖动到控件范围外的事件
CCControlEventTouchUpInside       = 1 << 5,     //  手指在控件范围内按下后松开的事件
CCControlEventTouchUpOutside      = 1 << 6,     //  手指在控件范围内按下,在控件范围外松开的事件
CCControlEventTouchCancel         = 1 << 7,     //  系统事件,取消当前控件的触摸操作
CCControlEventValueChanged        = 1 << 8      //  触摸拖动或以其他方式操作控件,导致其发出一系列不同值的事件
};

3. 事件原型定义

事件原型定义如下:

typedef void (CCObject::*SEL_CCControlHandler)(CCObject*, CCControlEvent);
#define cccontrol_selector(_SELECTOR) (SEL_CCControlHandler)(&_SELECTOR)

事件函数有两个参数,第一个参数是产生事件的对象,第二个参数是具体的事件,这是一个无符号 32 位整数,事件值就是 CCControlEventTouchDown 等定义的值。

4. 事件函数定义与实现

4.1 事件函数定义

void OnTouchDown(CCObject* pSender, extension::CCControlEvent event);
void OnTouchDragEnter(CCObject* pSender, extension::CCControlEvent event);
void OnTouchDragExit(CCObject* pSender, extension::CCControlEvent event);
void OnTouchDragInside(CCObject* pSender, extension::CCControlEvent event);
void OnTouchDragOutside(CCObject* pSender, extension::CCControlEvent event);
void OnTouchUpInside(CCObject* pSender, extension::CCControlEvent event);
void OnTouchUpOutside(CCObject* pSender, extension::CCControlEvent event);
void OnTouchCancel(CCObject* pSender, extension::CCControlEvent event);

4.2 事件函数实现

void HelloWorld::OnTouchDown(CCObject* pSender, extension::CCControlEvent event)
{
PrintLog("OnTouchDown:%u", event);
}

void HelloWorld::OnTouchDragEnter(CCObject* pSender, extension::CCControlEvent event)
{
PrintLog("OnTouchDragEnter:%u", event);
}

void HelloWorld::OnTouchDragExit(CCObject* pSender, extension::CCControlEvent event)
{
PrintLog("OnTouchDragExit:%u", event);
}

void HelloWorld::OnTouchDragInside(CCObject* pSender, extension::CCControlEvent event)
{
PrintLog("OnTouchDragInside:%u", event);
}

void HelloWorld::OnTouchDragOutside(CCObject* pSender, extension::CCControlEvent event)
{
PrintLog("OnTouchDragOutside:%u", event);
}

void HelloWorld::OnTouchUpInside(CCObject* pSender, extension::CCControlEvent event)
{
PrintLog("OnTouchUpInside:%u", event);
}

void HelloWorld::OnTouchUpOutside(CCObject* pSender, extension::CCControlEvent event)
{
PrintLog("OnTouchUpOutside:%u", event);
}

void HelloWorld::OnTouchCancel(CCObject* pSender, extension::CCControlEvent event)
{
PrintLog("OnTouchCancel:%u", event);
}

5. 按钮定义与事件绑定

init 方法中定义一个按钮,并绑定相应的事件:

{
extension::CCScale9Sprite * pBtnNormal = extension::CCScale9Sprite::create("up.png");
extension::CCScale9Sprite * pBtnDown = extension::CCScale9Sprite::create("up.png");
CCLabelTTF * pBtnCaption = CCLabelTTF::create("", "宋体", 30);
extension::CCControlButton * pBtn = extension::CCControlButton::create(pBtnCaption, pBtnNormal);
pBtn->setBackgroundSpriteForState(pBtnDown, extension::CCControlStateSelected);
pBtn->setPosition(GetPosition(pPlayerLayer, "UpPoint"));
pBtn->setAnchorPoint(CCPointZero);
pBtn->setPreferredSize(CCSizeMake(32, 32));
pBtn->setTag(100);
this->addChild(pBtn);
pBtn->addTargetWithActionForControlEvents(this, cccontrol_selector(HelloWorld::OnTouchDown), CCControlEventTouchDown);
pBtn->addTargetWithActionForControlEvents(this, cccontrol_selector(HelloWorld::OnTouchDragEnter), CCControlEventTouchDragEnter);
pBtn->addTargetWithActionForControlEvents(this, cccontrol_selector(HelloWorld::OnTouchDragExit), CCControlEventTouchDragExit);
pBtn->addTargetWithActionForControlEvents(this, cccontrol_selector(HelloWorld::OnTouchDragInside), CCControlEventTouchDragInside);
pBtn->addTargetWithActionForControlEvents(this, cccontrol_selector(HelloWorld::OnTouchDragOutside), CCControlEventTouchDragOutside);
pBtn->addTargetWithActionForControlEvents(this, cccontrol_selector(HelloWorld::OnTouchUpInside), CCControlEventTouchUpInside);
pBtn->addTargetWithActionForControlEvents(this, cccontrol_selector(HelloWorld::OnTouchUpOutside), CCControlEventTouchUpOutside);
pBtn->addTargetWithActionForControlEvents(this, cccontrol_selector(HelloWorld::OnTouchCancel), CCControlEventTouchCancel);
}

6. 注意事项

不要开启触摸事件,否则可能会出现问题,即不要使用以下代码:

// CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, true);

7. 事件触发条件说明

  • CCControlEventTouchDown:当鼠标按下且曾经点中按钮时,触发一次。
  • CCControlEventTouchDragEnter:当鼠标处于按下并曾经点中按钮的状态下,鼠标进入按钮范围时,触发一次。
  • CCControlEventTouchDragExit:当鼠标处于按下并曾经点中按钮的状态下,鼠标离开按钮范围时,触发一次。
  • CCControlEventTouchDragInside:当鼠标处于按下并曾经点中按钮的状态下,鼠标在按钮范围内移动时,每移动一次就触发一次。
  • CCControlEventTouchDragOutside:当鼠标处于按下并曾经点中按钮的状态下,鼠标在按钮范围外移动时,每移动一次就触发一次。
  • CCControlEventTouchUpInside:当鼠标处于按下并曾经点中按钮的状态下,鼠标在按钮范围内松开时,触发一次。
  • CCControlEventTouchUpOutside:当鼠标处于按下并曾经点中按钮的状态下,鼠标在按钮范围外松开时,触发一次。
  • CCControlEventTouchCancel:暂时没有发现能用鼠标触发这个事件的操作。

了解上述内容后,就可以根据实际需求实现相应的功能了。

作者信息

boke

boke

共发布了 3994 篇文章