Quick-cocos2d-x事件触摸机制

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)--吞噬事件,不向下传递

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ellis1970

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值