一、单点触摸
关于单点触摸事件的创建和监听有以下几个步骤:
1,创建一个空间如labelTTF,并且初始化,添加控件进层
2、设置一个事件监听器,并且定义和实现他的回调函数。
3、最后让导演将前面定义的监听器按照监听器和监听事件对应的方式添加进来。
<span style="font-size:18px;"> Size visibleSize = Director::getInstance()->getVisibleSize(); Vec2 origin = Director::getInstance()->getVisibleOrigin(); auto label = LabelTTF::create("click me", "宋体", 36); addChild(label); label->setPosition(visibleSize.width/2, visibleSize.height/2); auto *listener = EventListenerTouchOneByOne::create(); listener->onTouchBegan = [](Touch* t, Event* e){ log("ontouchbegan"); return false; }; Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, label);</span>
二、触摸目标的判断
在实现触摸事件的时候,我们常常会要求只有点击到特定的区域才会出现相应。这就需要你再代码 中进行判断,你触摸的那一点是不是在触摸目标的范围内。
在触摸事件中,监听器Lintener给label事件指定了一个触摸后的回调函数,这个回调函数里面有一个参数是e,类型是event,利用e->getcurrenttarget()函数就可以获取到我们的触摸目标,就是label,之后通过getBoundingBox()方法获取这个触摸目标的边界。最后判断一下它是否包含我们的触摸点。
containsPoint(t->getLocation())
t->getLocation()显示的就是获取我们触摸点的位置。而且,要注意的一件事就是,如果你是用labelttf来创建的label空间,那么获取的点的左边很可能是错误的。所以用label::create();这个函数来创建。这时cocos的一个Bug把。
<span style="font-size:18px;">auto label = Label::create("click me", "宋体", 36); addChild(label); label->setPosition(visibleSize.width/2, visibleSize.height/2); auto *listener = EventListenerTouchOneByOne::create(); listener->onTouchBegan = [](Touch* t, Event* e){ if(e->getCurrentTarget()->getBoundingBox().containsPoint(t->getLocation())) { log("ontouchbegan"); } return false; };</span>
三、事件传递
事件的传递机制说白了,就是你在游戏中触发的事件是由顺序的。
一般来说事件有以下几种
<span style="font-size:18px;"> std::function<bool(Touch*, Event*)> onTouchBegan; std::function<void(Touch*, Event*)> onTouchMoved; std::function<void(Touch*, Event*)> onTouchEnded; std::function<void(Touch*, Event*)> onTouchCancelled; </span>
从字面意思上我们基本 就能确定这些个 事件能够做什么。但是仔细 观察可以发现,几个事件的函数只有一个比较特殊就是onTouchBegan。它要求返回值是Bool类型。也就是说,所以的事件,Ontouchbegan这个事件应该先执行,因为你一定要先按下你的鼠标,才去执行拖动,弹起,取消等动作,假如我现在有以下代码:
<span style="font-size:18px;"> listener->onTouchBegan = [](Touch* t, Event* e){ if(e->getCurrentTarget()->getBoundingBox().containsPoint(t->getLocation())) { log("ontouchbegan"); } return false; }; listener->onTouchMoved = [](Touch *t, Event* e) { log("ontouchmoved"); };</span>
如果onTouchBegan在函数中返回值是false,那么它将不会触发以后所设定的事件,但是如果设定为true,就表明可以继续除法之后的事件。
四、监听物理按键事件
手机上面的每一个物理按键和电脑上面的一样都是有一个整数值代表他们。
首先就是创建一个专门用来监听物理按键事件的监听器:
auto listener = EventListenerKeyboard::create();
然后通过指定onKeyReleased函数,并且将创建的监听器加入到导演的管理。在真机上调试的时候就可以看到,每次按一个键,相应的键的数值都会显现出来。
auto listener = EventListenerKeyboard::create(); listener->onKeyReleased = [](EventKeyboard::KeyCode code, Event* e){ log("key code %d", code); //显示按键数值 switch(code) { case EventKeyboard::KeyCode::KEY_ESCAPE: //通过switch语句让不同的按键执行不同的 动作 Director::getInstance()->end(); break; default: break; } }; Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, this);
COCOS2DX事件交互处理