C++和Quick项目在监听触摸事件调用接口的区别:
对于node,按是否自带监听器可分为2类,带监听器的node,比如按钮;和不带监听器的node,比如sprite;
关于事件监听,详细介绍可参考【cocos2dx之event事件(二):事件监听器EventListener】
传送门:http://blog.csdn.net/ellis1970/article/details/79303486
C++监听按钮:
pBtn->addClickEventListener(CC_CALLBACK_1(HelloWorld::btnRunCB, this));
void HelloWorld::btnRunCB(Ref* sender)
{
CCLOG("Clicking btn")
}
C++监听精灵:
Sprite* apple = (Sprite*)_rootNode->getChildByName("apple");
EventListenerTouchOneByOne* listenerTouchOne1 = EventListenerTouchOneByOne::create();
listenerTouchOne1->onTouchBegan = [&](Touch* touch, Event* event)->bool {
Sprite* apple = (Sprite*)_rootNode->getChildByName("apple");
Point clickingPoint = touch->getLocation();
int rectOriginalX = apple->getPosition().x - apple->getContentSize().width / 2;
int rectOriginalY = apple->getPosition().y - apple->getContentSize().height / 2;
Rect rect = Rect(rectOriginalX, rectOriginalY, apple->getContentSize().width, apple->getContentSize().height);
if (rect.containsPoint(clickingPoint))
{
CCLOG("clicking apple");
}
return true;
};
dispatcher->addEventListenerWithSceneGraphPriority(listenerTouchOne1, apple);
Lua监听按钮:
local images = {normal = "btn5.png", pressed = "btn6.png"}
local btnRunAction = cc.ui.UIPushButton.new(images)
btnRunAction:setPosition(800,100)
btnRunAction:addTo(self)
local function btnRunActionCB(event)
print("clicking btn")
end
btnRunAction:onButtonPressed(btnRunActionCB)
Lua监听精灵:
local sprite = display.newSprite("a0.png")
sprite:setPosition(100, 320)
sprite:addTo(self)
local function spriteClickingCB(event)
print("clicking sprite")
return false
end
sprite:setTouchEnabled(true)
sprite:addNodeEventListener(cc.NODE_TOUCH_EVENT,spriteClickingCB)
对比可以看出,C++对于自身不带listener的对象,触摸时需要判断触摸点是否落在对象占据的矩形内; Lua则对于所有的node都可以直接监听触摸.
通过改变addNodeEventListener的第一个参数可以改变监听事件的类型:
node:addNodeEventListener(cc.NODE_EVENT,function(event)end)--节点事件
node:addNodeEventListener(cc.NODE_ENTER_FRAME_EVENT,function(dt)end)--帧事件
node:addNodeEventListener(cc.KEYPAD_EVENT,function(event)end)--键盘事件(只对安卓有效)
node:addNodeEventListener(cc.NODE_TOUCH_EVENT,function(event)end)--触摸事件
setTouchEnabled(bool)和setTouchCaptureEnabled(bool)这两个API可以控制node是否响应触摸事件;
区别是前者只对当前Node有效,后者对Node及其子Node有效.
另外对于新创建的node,默认状态是:
setTouchEnabled(false)--不响应触摸
setTouchSwallowEnabled(true)--吞噬事件,不向下传递