Cocos2d-x学习笔记
键盘事件
键盘事件和触摸事件不同,它没有空间方面的信息。键盘事件不仅可以响应键盘,也可以响应设备的菜单。
键盘事件监听器是EventListenerKeyboard,其中属性如下:
std::function<void(EventKeyboard::KeyCode, Event *)> onKeyPressed
:当键盘按下时回调该函数所指定的函数。std::function<void(EventKeyboard::KeyCode, Event *)> onKeyReleased
:当键抬起时回调该函数所指定的函数。
示例
void HelloWorld::onEnter() { Layer::onEnter(); log("HelloWorld onEnter"); auto listener = EventListenerKeyboard::create(); listener->onKeyPressed = [](EventKeyboard::KeyCode keyCode, Event * event) { log("Key with keycode % d pressed", keyCode); } listener->onKeyReleased = [](EventKeyboard::KeyCode keyCode, Event * event) { log("Key with keycode % d released", keyCode); } EventDispatcher * eventDispatcher = Director::getInstance()->getEventDispatcher(); eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this); }
鼠标事件
鼠标事件监听器是EventListenerMouse。
std::function<void(Event * event)> onMouseDown
:当鼠标键按下时回调该属性所指定函数。std::function<void(Event * event)> onMouseMove
:当鼠标键移动时回调该属性所指定函数。std::funtion<void(Event * event)> onMouseScroll
:当鼠标滚轮滚动时回调该属性所指定函数。std::funtion<void(Event * event)> onMouseUp
:当鼠标键抬起时回调该属性所指定的函数。
示例
void HelloWorld::onEnter() { Layer::onEnter(); log("HelloWorld onEnter"); auto listener = EventListenerMouse::create(); listener->onMouseMove = [](Event * event) { EventMouse * e = (EventMouse *)event; log("Mouse Down detected, onMouseMove"); }; listener->onMouseUp = [](Event * event) { EventMouse * e = (EventMouse *)event; log("Mouse Down detected, onMouseUp"); } listener->onMouseDown = [](Event * event) { EventMouse * e = (EventMouse *)event; log("Mouse Down detected, onMouseDown"); } listener->onMouseScroll = [](Event * event) { EventMouse * e = (EventMouse *)event; log("Mouse Down detected, onMouseScroll"); } EventDispatcher * eventDispatcher = Director::getInstance()->getEventDispatcher(); eventDispatcher->addEventListenerWIthSceneGraphPriority(listener, this); }
在层中进行事件处理
层时节点的派生类。我们可以在层中响应事件处理,但是层是一个非常特殊的节点,场景中的主要工作都是在层中完成的。因此,Layer定义了一些与事件相关的函数。
Layer中单点触摸事件相关的函数
bool onTouchBegan(Touch * touch, Event * event)
void onTouchCancelled(Touch * touch, Event * event)
void onTouchEnded(Touch * touch, Event * event)
void onTouchMoved(Touch * touch, Event * event)
Lyer中多点触摸事件相关的函数
void onTouchesBegan(const std::vector<Touch *>&touches, Event * event)
void onTouchesCancelled(const std::vector<Touch *>&touches, Event * event)
void onTouchesEnded(const std::vector<Touch *>&touches, Event * event)
void onTouchesMoved(const std::vector<Touch *>&touches, Event * event)
Layer中键盘事件相关的函数
void onKeyPressed(EventKeyboard::KeyCode keyCode, Event * event)
void onKeyReleased(EventKeyboard::KerCode keyCode, Event * event)
Layer中加速度事件相关的函数
void onAcceleration(Acceleration * arc, Event * event)
触摸事件
层中的触摸事件使用起来比较简单,由于事件监听的对象是层,而不是层中的精灵等对象,当判断是否点击了哪个精灵对象时比较麻烦,我们需要使用Rect的containsPoint函数逐一判断每个精灵对象。
在层中的触摸事件的一般流程开发是,首先在层的h文件中定义要重写的事件相关函数,代码如下:
class HelloWorld : public cocos2d::Layer { public: ··· virtual bool onTouchBegan(cocos2d::Touch * touch, cocos2d::Event * event); virtual void onTouchMoved(cocos2d::Touch * touch, cocos2d::Event * event); virtual void onTouchEnded(cocos2d::Touch * touch, cocos2d::Event * event); CREATE_FUNC(HelloWorld); }
然后在CPP文件中实现相关代码:
bool HelloWorld::init() { if(!Layer::init()) { return false; } ··· setTouchEnabled(true);// 开始触摸事件的支持 // 设置为单点触摸 setTouchMode(Touch::DispathcMode::ONE_BY_ONE); return true; } // 重写三个事件函数 bool HelloWorld::onTouchBegan(Touch * touch, Event * event) { log("onTouchBegan"); ··· return false; } void HelloWorld::onTouchMoved(Touch * touch, Event * event) { log("onTouchMoved"); ··· } void HelloWorld::onTouchEnded(Touch * touch, Event * event) { log("onTouchEnded"); ··· }
有关事件处理的初始化可以放在onEnter
函数中,也可以放在init
函数中,与上次代码进行比较,可以发现,层中的事件处理比较简单,不需要注册监听器,不需要指定它的事件响应的优先级别,但也有缺点,在处理多个精灵的时候,不是很方便。