4.3 鼠标和键盘的加入
在大多数时候,鼠标和键盘应该是PC端应用才会用到的,虽然在手机中有时也会用到类似于鼠标的触摸板(如摩托罗拉ME600)或者是类似于键盘的东西(如诺基亚N97),但是用户体验往往非常不好,也不适合在游戏中使用。但是由于现在的移动设备性能越来越强悍,并且已经基本上开始支持OTG功能,已经可以通过转接线直接给平板或者手机插上键盘鼠标来进行辅助。因此在移动游戏开发中考虑到鼠标和键盘的使用也是非常正常的了。
本节将通过一个例子来展示Cocos2d-x对键盘和鼠标的支持,完整代码可参考源文件当前目录下的项目ChapterFour02,关键代码如范例4-4所示。
【范例4-4】在Cocos2d-x中使用键盘和鼠标。
01 Size visibleSize = Director::getInstance()->getVisibleSize(); //获取屏幕尺寸 02 Vec2 origin = Director::getInstance()->getVisibleOrigin(); //获取坐标原点 03 //在屏幕上显示指针图案 04 this->mouse = Sprite::create("mouse.png"); 05 this->mouse->setScale(0.3f); 06 this->addChild(mouse); 07 auto myKeyListener = EventListenerKeyboard::create(); //创建事件监听器监听键盘事件 08 //当键盘被按下时响应 09 myKeyListener->onKeyPressed = [](EventKeyboard::KeyCode keycode, Cocos2d::Event *event) 10 { 11 CCLOG("key is pressed,keycode is %d",keycode); 12 }; 13 //当键盘按键弹回时响应 14 myKeyListener->onKeyReleased = [](EventKeyboard::KeyCode keycode, Cocos2d::Event *event) 15 { 16 CCLOG("key is released,keycode is %d", keycode); 17 }; 18 auto myMouseListener = EventListenerMouse::create(); //创建事件监听器监听鼠标事件 19 //鼠标移动 20 myMouseListener->onMouseMove = [=](Event *event) 21 { 22 EventMouse* e = (EventMouse*)event; 23 this->mouse->setPosition(e->getCursorX(), e->getCursorY() + visibleSize.height); 24 }; 25 //鼠标被按下 26 myMouseListener->onMouseDown = [=](Event *event) 27 { 28 this->mouse->setScale(0.2f);//鼠标按键按下,屏幕上的“箭头”尺寸缩小 29 }; 30 //鼠标按键弹起 31 myMouseListener->onMouseUp = [=](Event *event) 32 { 33 this->mouse->setScale(0.3f);//鼠标按键抬起,屏幕上的“箭头”尺寸放大 34 }; 35 //将事件监听器与场景绑定 36 _eventDispatcher->addEventListenerWithSceneGraphPriority (myKeyListener, this); 37 _eventDispatcher->addEventListenerWithSceneGraphPriority (myMouseListener, this);
在PC上运行本范例可以看到,在屏幕上“箭头”图案跟随着鼠标指针的移动而移动(如图4-6)而当单击鼠标按键时,屏幕中的“箭头”会随着用户的操作缩小和恢复原状。当按下键盘上某个按键时,在Visual Studio的输出面板上也会弹出信息,如图4-7所示。
图4-6 “箭头”随着鼠标指针的移动而移动
图4-7 Visual Studio输出窗口显示的内容
通过本节的范例可以看出,在Cocos2d-x中实现鼠标和键盘控制的功能非常简单,需要用到EventListenerKeyboard类和EventListenerMouse类,分别用来监听键盘和鼠标的操作。
提示:虽然在前的触摸操作可以在PC端通过鼠标实现,但是这与在本节介绍的鼠标事件是有区别的。在触摸事件中只有当onTouchMoved事件被触发时才会得到响应,而在鼠标事件中则可以随时对鼠标指针的坐标进行响应。比如在游戏《水果忍者》中手指划过会显示“刀”的轨迹,这就是通过触摸事件来实现的,而在游戏《魔兽争霸》中,无论是否单击,都会在屏幕上显示鼠标指针,这就是鼠标对事件的响应。
在鼠标事件中,虽然用法与触摸事件相似,但是在各个事件的参数中并没有直接传递当前鼠标指针的坐标信息。因此就需要通过一个简单的转换来获取,如范例第22、23行所示。
而在键盘事件中,所传递的用来表示各个按键的参数keycode使用的编码方式也不是常用的ASCII码,因此需要先区分再使用。好在游戏中通常不会牵扯到太多的按键,一般都是A、S、D、W作为方向键再加上几个操作键,因此可以通过switch语句挨个区分。
另外,在键盘事件中,按键按下和弹起分别是两个不同的事件,因此在使用时也需要加以区分,比如在动作游戏中,为了保证游戏的打击感就要使用按键被按下作为事件发生的标准,而在跳过过场动画或者“确认”这样的功能中,则要以按键弹起作为结束的标准。