经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 游戏设计 » 查看文章
cocos2d-x 系统学习cocos(2) 交互
来源:cnblogs  作者:凌夜霜  时间:2019/10/21 8:40:44  对本文有异议

交互

玩游戏的时候,我们需要用输入设备和游戏进行交互,那么游戏需要对玩家做出相应,比如说按下键盘的上下左右,角色就朝着对应的方向移动,按下技能键,角色就释放技能

键盘监听

响应

cocos2d-x中要实现键盘监听,首先先编写游戏对键盘做成响应的函数

  1. "HelloWorldScene.h"
  2. void Press(EventKeyboard::KeyCode keycode, Event *event);//按下
  3. void Release(EventKeyboard::KeyCode keycode, Event *event);//释放

将这两个函数声明在HelloWorldScene.h
接下来是两个函数的定义

  1. "HelloWorldScene.cpp"
  2. void HelloWorld::Press(EventKeyboard::KeyCode keycode, Event* event)
  3. {
  4. using KC = EventKeyboard::KeyCode;
  5. switch (keycode)
  6. {
  7. case KC::KEY_UP_ARROW:
  8. log("up press");
  9. break;
  10. case KC::KEY_DOWN_ARROW:
  11. log("down press");
  12. break;
  13. case KC::KEY_RIGHT_ARROW:
  14. log("right press");
  15. break;
  16. case KC::KEY_LEFT_ARROW:
  17. log("left press");
  18. break;
  19. case KC::KEY_Z:
  20. log("Explosion!");
  21. break;
  22. default:
  23. break;
  24. }
  25. }
  26. void HelloWorld::Release(EventKeyboard::KeyCode keycode, Event* event)
  27. {
  28. using KC = EventKeyboard::KeyCode;
  29. switch (keycode)
  30. {
  31. case KC::KEY_UP_ARROW:
  32. log("up release");
  33. break;
  34. case KC::KEY_DOWN_ARROW:
  35. log("down release");
  36. break;
  37. case KC::KEY_RIGHT_ARROW:
  38. log("right release");
  39. break;
  40. case KC::KEY_LEFT_ARROW:
  41. log("left release");
  42. break;
  43. case KC::KEY_Z:
  44. log("Boom!");
  45. break;
  46. default:
  47. break;
  48. }
  49. }

这两个函数对键盘的上下左右和z键做出相应

注册监听

HelloWorld::init()函数中加入这段代码

  1. "HelloWorldScene.cpp"
  2. auto *dispatcher = Director::getInstance()->getEventDispatcher();
  3. auto* keyListener = EventListenerKeyboard::create();//创建键盘按键监听器
  4. keyListener->onKeyPressed = CC_CALLBACK_2(HelloWorld::Press, this);//设置按键按下的响应
  5. keyListener->onKeyReleased = CC_CALLBACK_2(HelloWorld::Release, this);//设置按键释放的响应
  6. //键盘按键被弹回时响应
  7. dispatcher->addEventListenerWithSceneGraphPriority(keyListener,this);

编译,如果出现这样的错误的话

不要慌,是HelloWorldScene.h中没有使用cocos2d命名空间,在#include "cocos2d.h"这行代码下面加上USING_NS_CC;就好了,USING_NS_CC;是一个宏,相当于using namespace cocos2d

  1. "HelloWorldScene.h"
  2. #include "cocos2d.h"
  3. USING_NS_CC;
  4. class HelloWorld : public cocos2d::Scene
  5. {
  6. ...
  7. }

改成这样,或者直接用作用域解析符来声明形参

  1. "HelloWorldScene.h"
  2. #include "cocos2d.h"
  3. //USING_NS_CC;
  4. class HelloWorld : public cocos2d::Scene
  5. {
  6. public:
  7. ...
  8. void Press(cocos2d::EventKeyboard::KeyCode keycode, cocos2d::Event* event);//按下
  9. void Release(cocos2d::EventKeyboard::KeyCode keycode, cocos2d::Event* event);//释放
  10. ...
  11. };

程序成功运行起来了,按下按键查看窗口输出

成功实现了交互

鼠标监听

响应

和键盘监听一样的步骤,我们首先在HelloWorldScene.h声明两个鼠标响应的函数,当然,如果我们只需要一个按下的功能,那么释放的功能不需要写也可以的,这两个函数不存在捆绑关系

  1. "HelloWorldScene.h"
  2. void MouseDown(cocos2d::Event* event);
  3. void MouseUp(cocos2d::Event* event);

HelloWorldScene.cpp中定义这两个函数

  1. "HelloWorldScene.cpp"
  2. void HelloWorld::MouseDown(cocos2d::Event* event)
  3. {
  4. EventMouse* e = static_cast<EventMouse*>(event);
  5. log("press (%f, %f)", e->getCursorX(), e->getCursorY());
  6. }
  7. void HelloWorld::MouseUp(cocos2d::Event* event)
  8. {
  9. EventMouse* e = static_cast<EventMouse*>(event);
  10. log("release (%f, %f)", e->getCursorX(), e->getCursorY());
  11. }

这两个函数的功能是输出按下或者释放鼠标的位置

注册监听

HelloWorld::init()函数中加入这段代码注册监听,原理和键盘监听基本一样,只不过回调的类型是CC_CALLBACK_1而不是键盘的CC_CALLBACK_2, 回调的类型根据参数类型和数量作区别

  1. "HelloWorldScene.cpp"
  2. auto listener = EventListenerMouse::create();
  3. listener->onMouseDown = CC_CALLBACK_1(HelloWorld::MouseDown,this);
  4. listener->onMouseUp = CC_CALLBACK_1(HelloWorld::MouseUp,this);
  5. _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);

运行程序,点击鼠标测试功能

点击了接近右上角和左下角的两个位置,可以发现鼠标事件中存的坐标是游戏世界中的坐标,范围也是和游戏分辨率有关的。

原文链接:http://www.cnblogs.com/NightFrost/p/11704179.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号