Cocos2d-x游戏开发实战精解
上QQ阅读APP看书,第一时间看更新

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语句挨个区分。

另外,在键盘事件中,按键按下和弹起分别是两个不同的事件,因此在使用时也需要加以区分,比如在动作游戏中,为了保证游戏的打击感就要使用按键被按下作为事件发生的标准,而在跳过过场动画或者“确认”这样的功能中,则要以按键弹起作为结束的标准。