键盘鼠标等事件响应机制
发表于2016-04-05
在说明其他事件处理机制之前,先看看c++11中的一个新特性lambda表达式,也就是匿名函数,当我们的函数比较小,代码量少的时候,为了简洁和效率使用匿名函数,用法如下。
int x = 10;
//使用lambda表达式的好处是简洁效率高,当你的函数只有一行代码的时候用它省的定义函数了,如果函数的代码很多
//最好写成普通的函数,lambda是代替函数指针的一个好方法
//lambda表达式(匿名函数)[]代表的就是一个lambda表达式,()是函数的参数列表,{}是函数体,->void代表的是返回值类型
auto func = [](int i)->void
{
std::cout<<"hello cocos!"<
std::cout<
};
/*
[]中可以填写如下的一些内容
[] 不截取任何变量
[&} 截取外部作用域中所有变量,并作为引用在函数体中使用
[=] 截取外部作用域中所有变量,并拷贝一份在函数体中使用
[=, &foo] 截取外部作用域中所有变量,并拷贝一份在函数体中使用,但是对foo变量使用引用
[bar] 截取bar变量并且拷贝一份在函数体重使用,同时不截取其他变量
[this] 截取当前类中的this指针。如果已经使用了&或者=就默认添加此选项。
*/
auto func2 = [x]()
{
std::cout<
//这里的return是默认的,在lambda表达式处没有写
return x;
};
func(2);
func2();
先来看对键盘事件的响应,用法和触摸事件的处理类似。除了键盘,还可以是终端设备的各个菜单,他们使用同一个监听器来进行处理,下面看看代码中如何使用。
bool HelloWorld::init()
{
//////////////////////////////
// 1. super init first
if ( !Layer::init() )
{
return false;
}
//键盘事件处理监听器
auto listener = EventListenerKeyboard::create();
//和回调函数绑定
listener->onKeyPressed = CC_CALLBACK_2(HelloWorld::onKeyPressed,this);
listener->onKeyReleased = CC_CALLBACK_2(HelloWorld::onKeyReleased,this);
//添加到事件分发器中
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener,this);
return true;
}
void HelloWorld::onKeyPressed(EventKeyboard::KeyCode keyCode,Event * pEvent)
{
CCLOG("keycode %c is pressed!",keyCode);
//KEY_KP_UP = 0x10B8
if(keyCode == EventKeyboard::KeyCode::KEY_UP_ARROW)
CCLOG("up");
else if(keyCode == EventKeyboard::KeyCode::KEY_DOWN_ARROW)
CCLOG("down");
else if(keyCode == EventKeyboard::KeyCode::KEY_LEFT_ARROW)
CCLOG("left");
else if(keyCode == EventKeyboard::KeyCode::KEY_RIGHT_ARROW)
CCLOG("right");
}
void HelloWorld::onKeyReleased(EventKeyboard::KeyCode keyCode,Event * pEvent)
{
CCLOG("keycode %c is released!",keyCode);
}

//鼠标处理事件监听器
auto mouse_listener = EventListenerMouse::create();
mouse_listener->onMouseDown = [](Event * pEvent)
{
CCLOG("down");
};
mouse_listener->onMouseUp = [](Event * pEvent)
{
CCLOG("up");
};
mouse_listener->onMouseMove = [](Event * pEvent)
{
EventMouse* e = (EventMouse*)pEvent;
CCLOG("MousePosition X: %f , Y:%f",e->getCursorX(),e->getCursorY());
};
mouse_listener->onMouseScroll = [](Event * pEvent)
{
CCLOG("scroll");
};
_eventDispatcher->addEventListenerWithSceneGraphPriority(mouse_listener,this);

还有加速度计事件监听器和自定义的事件监听器,因为没有用到这里就不写了,大家自己研究吧。事件监听器的移除可以使用_eventDispatcher->removeEventListener(listener);这个方法是移除指定的事件监听器的,_eventDispatcher->removeAllEventListeners();是移除所有的事件监听器,包括菜单的事件监听器,所以我们最好使用第一种方法。
加入GAD的核心用户QQ群:484290331,各类活动奖励任你拿,最新资讯任你读,众多教学任你免费学,如此好地方赶紧加入吧!另VR专属群:476511561,专业VR技术分享,专业导师指导为你答疑解惑,大型小型活动奖励等你拿,免费学习赚奖励的天地,欢迎你加入哟!
