示例代碼
- 新建場景類繼承Scene。
- 重載init如下
bool ActionScene::init(){
// 1. super init first
if ( !Layer::init() )
{
return false;
}
touchEvent(this);
return true;
}
- 在init前寫上全局監聽函數(或另建測試類)
void touchEvent(ActionScene *scene){
//座標標籤
Label *label=Label::create();
label->setString("0,0");
label->setPosition(Point(50,200));
scene->addChild(label);
//目標1
Sprite *sprite1=Sprite::create("sprite1.png");
sprite1->setPosition(Point(200,200));
scene->addChild(sprite1);
//目標2
Sprite *sprite2=Sprite::create("sprite2.png");
sprite2->setPosition(Point(200,200));
scene->addChild(sprite2);
//設置監聽對象
auto lister=EventListenerTouchOneByOne::create();
//在回調列表中阻止繼續傳播
lister->setSwallowTouches(true);
//觸摸按下
lister->onTouchBegan=[](Touch *touch,Event *event){
auto target=static_cast<Sprite*>(event->getCurrentTarget());
Point pnow= Director::getInstance()->convertToGL(touch->getLocationInView());
if(target->getBoundingBox().containsPoint(pnow)){
target->setOpacity(100);
return true;
}else{
return false;
}
};
//觸發擡起
lister->onTouchEnded=[](Touch *touch,Event *event){
auto target=static_cast<Sprite*>(event->getCurrentTarget());
Point pnow= Director::getInstance()->convertToGL(touch->getLocationInView());
target->setOpacity(255);
};
//觸摸按下移動
lister->onTouchMoved=[=](Touch *touch,Event *event){
auto target=static_cast<Sprite*>(event->getCurrentTarget());
Point pnow= Director::getInstance()->convertToGL(touch->getLocationInView());
char strshow[1000];
sprintf(strshow,"(%.2f,%.2f)",pnow.x,pnow.y);
label->setString(strshow);
};
auto eventDisP=Director::getInstance()->getEventDispatcher();
//綁定目標1
eventDisP->addEventListenerWithSceneGraphPriority(lister,sprite1);
//綁定目標2
eventDisP->addEventListenerWithSceneGraphPriority(lister->clone(),sprite2);
}
該函數實現的是,對某個精靈點擊和鬆開會改變該精靈的透明度。以及在移動鼠標時顯示座標
注意處
有界面的框架(如MFC、WinFrom)中都有一套事件監聽模塊。CC大致與它們相同,略微不同的地方是寫法(廢話)以及回調類型。在上面定義了三個動作的響應函數(落下,移動,擡起)。在MFC中它們回調函數類型相同,看一下CC中的定義。
其中onTouchBegan的返回類型和其它動作的返回類型不同,爲bool。
- 如果返回true,且其它動作有定義,則會觸發執行
- 如果返回false,其它定義的動作不會觸發
在本例中,如果點擊的時候沒有點在某個精靈上,那麼移動鼠標不會得到鼠標當前的座標,鬆開鼠標修改該精靈透明度的代碼也不會執行。
*主要內容來自cocos2dx 3.0遊戲開發之旅 Section 5.4