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函数中,与上次代码进行比较,可以发现,层中的事件处理比较简单,不需要注册监听器,不需要指定它的事件响应的优先级别,但也有缺点,在处理多个精灵的时候,不是很方便。
496

被折叠的 条评论
为什么被折叠?



