在说明其他事件处理机制之前,先看看c++11中的一个新特性lambda表达式,也就是匿名函数,当我们的函数比较小,代码量少的时候,为了简洁和效率使用匿名函数,用法如下。

int x = 10;

	//使用lambda表达式的好处是简洁效率高,当你的函数只有一行代码的时候用它省的定义函数了,如果函数的代码很多
	//最好写成普通的函数,lambda是代替函数指针的一个好方法

	//lambda表达式(匿名函数)[]代表的就是一个lambda表达式,()是函数的参数列表,{}是函数体,->void代表的是返回值类型
	auto func = [](int i)->void
	{
		std::cout<<"hello cocos!"<<std::endl;
		std::cout<<i<<std::endl;
	};

	/*
	[]中可以填写如下的一些内容
	[] 不截取任何变量
	[&} 截取外部作用域中所有变量,并作为引用在函数体中使用
	[=] 截取外部作用域中所有变量,并拷贝一份在函数体中使用
	[=, &foo]   截取外部作用域中所有变量,并拷贝一份在函数体中使用,但是对foo变量使用引用
	[bar]   截取bar变量并且拷贝一份在函数体重使用,同时不截取其他变量
	[this]  截取当前类中的this指针。如果已经使用了&或者=就默认添加此选项。
	*/
	auto func2 = [x]()
	{
		std::cout<<x<<std::endl;
		//这里的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();是移除所有的事件监听器,包括菜单的事件监听器,所以我们最好使用第一种方法。