(基于cocos2dx2.2.2)cocos2dx的按鈕類定義在extensions\GUI\CCControlExtension\CCControlButton.h
在需要用的時(shí)候,包括就可以了。
我們在相應(yīng)的申明的地方,包含下面三個(gè)頭文件
#include "GUI/CCControlExtension/CCControlButton.h"
#include "GUI/CCControlExtension/CCScale9Sprite.h"
#include "GUI/CCControlExtension/CCControl.h"
然按鈕的事件有如下定義
enum
{
CCControlEventTouchDown = 1 << 0, // A touch-down event in the control.
CCControlEventTouchDragInside = 1 << 1, // An event where a finger is dragged inside the bounds of the control.
CCControlEventTouchDragOutside = 1 << 2, // An event where a finger is dragged just outside the bounds of the control.
CCControlEventTouchDragEnter = 1 << 3, // An event where a finger is dragged into the bounds of the control.
CCControlEventTouchDragExit = 1 << 4, // An event where a finger is dragged from within a control to outside its bounds.
CCControlEventTouchUpInside = 1 << 5, // A touch-up event in the control where the finger is inside the bounds of the control.
CCControlEventTouchUpOutside = 1 << 6, // A touch-up event in the control where the finger is outside the bounds of the control.
CCControlEventTouchCancel = 1 << 7, // A system event canceling the current touches for the control.
CCControlEventValueChanged = 1 << 8 // A touch dragging or otherwise manipulating a control, causing it to emit a series of different values.
};
事件原型定義:typedef void (CCObject::*SEL_CCControlHandler)(CCObject*, CCControlEvent);
并用宏cccontrol_selector定義了
#define cccontrol_selector(_SELECTOR) (SEL_CCControlHandler)(&_SELECTOR)
事件的兩個(gè)參數(shù)分別的產(chǎn)生事件的對象,具體的事件,這是一個(gè)無符號32位整數(shù),事件值就是CCControlEventTouchDown等定義的值。
在這里,定義了事件函數(shù)
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);
具體事件實(shí)現(xiàn)如下
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);
}
然后定義一個(gè)按鈕,在init中實(shí)現(xiàn)
{
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);
}
需要注意的事件,不要開啟touch事件,否則會(huì)找不到。
也就是這句//CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, true);
具體的按鈕事件實(shí)驗(yàn)結(jié)果說明:
CCControlEventTouchDown:鼠標(biāo)該處于按下并曾經(jīng)點(diǎn)中按鈕時(shí),則觸發(fā)一次
CCControlEventTouchDragEnter:當(dāng)鼠標(biāo)處于按下并曾經(jīng)點(diǎn)中按鈕的狀態(tài)下,鼠標(biāo)進(jìn)入按鈕范圍,則觸發(fā)一次 ,也就是處于按下狀態(tài),回到該按鈕區(qū)域
CCControlEventTouchDragExit:當(dāng)鼠標(biāo)處于按下并曾經(jīng)點(diǎn)中按鈕的狀態(tài)下,鼠標(biāo)離開按鈕范圍,則觸發(fā)一次 ,也就是處于按下狀態(tài),離開該按鈕區(qū)域
CCControlEventTouchDragInside:當(dāng)鼠標(biāo)處于按下并曾經(jīng)點(diǎn)中按鈕的狀態(tài)下,鼠標(biāo)進(jìn)入按鈕范圍,則觸發(fā),每產(chǎn)生移動(dòng),就會(huì)觸發(fā) ,
CCControlEventTouchDragOutside: 當(dāng)鼠標(biāo)處于按下并曾經(jīng)點(diǎn)中按鈕的狀態(tài)下,鼠標(biāo)離開按鈕范圍,則觸發(fā),每產(chǎn)生移動(dòng),就會(huì)觸發(fā)
CCControlEventTouchUpInside:當(dāng)鼠標(biāo)處于按下并曾經(jīng)點(diǎn)中按鈕的狀態(tài)下,鼠標(biāo)松開且在按鈕范圍內(nèi),則觸發(fā)一次,也就是處于按下狀態(tài),并在該按鈕區(qū)域放起
CCControlEventTouchUpOutside:當(dāng)鼠標(biāo)處于按下并曾經(jīng)點(diǎn)中按鈕的狀態(tài)下,鼠標(biāo)松開且在按鈕范圍外,則觸發(fā)一次 也就是處于按下狀態(tài),但是已經(jīng)離開該按鈕區(qū)域,再放起
CCControlEventTouchCancel:暫時(shí)沒有發(fā)現(xiàn)能用鼠標(biāo)觸發(fā)這個(gè)事件的操作
了解后,就可以根據(jù)實(shí)際要求實(shí)現(xiàn)了