交互

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

键盘监听

响应

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

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

将这两个函数声明在HelloWorldScene.h

接下来是两个函数的定义

"HelloWorldScene.cpp"
void HelloWorld::Press(EventKeyboard::KeyCode keycode, Event* event)
{
using KC = EventKeyboard::KeyCode;
switch (keycode)
{
case KC::KEY_UP_ARROW:
log("up press");
break;
case KC::KEY_DOWN_ARROW:
log("down press");
break;
case KC::KEY_RIGHT_ARROW:
log("right press");
break;
case KC::KEY_LEFT_ARROW:
log("left press");
break;
case KC::KEY_Z:
log("Explosion!");
break;
default:
break;
}
} void HelloWorld::Release(EventKeyboard::KeyCode keycode, Event* event)
{
using KC = EventKeyboard::KeyCode;
switch (keycode)
{
case KC::KEY_UP_ARROW:
log("up release");
break;
case KC::KEY_DOWN_ARROW:
log("down release");
break;
case KC::KEY_RIGHT_ARROW:
log("right release");
break;
case KC::KEY_LEFT_ARROW:
log("left release");
break;
case KC::KEY_Z:
log("Boom!");
break;
default:
break;
}
}

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

注册监听

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

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

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



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

"HelloWorldScene.h"
#include "cocos2d.h"
USING_NS_CC;
class HelloWorld : public cocos2d::Scene
{
...
}

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

"HelloWorldScene.h"
#include "cocos2d.h"
//USING_NS_CC;
class HelloWorld : public cocos2d::Scene
{
public:
...
void Press(cocos2d::EventKeyboard::KeyCode keycode, cocos2d::Event* event);//按下
void Release(cocos2d::EventKeyboard::KeyCode keycode, cocos2d::Event* event);//释放
...
};

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



成功实现了交互

鼠标监听

响应

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

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

HelloWorldScene.cpp中定义这两个函数

"HelloWorldScene.cpp"
void HelloWorld::MouseDown(cocos2d::Event* event)
{
EventMouse* e = static_cast<EventMouse*>(event);
log("press (%f, %f)", e->getCursorX(), e->getCursorY());
} void HelloWorld::MouseUp(cocos2d::Event* event)
{
EventMouse* e = static_cast<EventMouse*>(event);
log("release (%f, %f)", e->getCursorX(), e->getCursorY());
}

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

注册监听

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

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

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



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

最新文章

  1. Java Web学习过程的思维导图
  2. PHP_Bibel阅读学习(一)——看书看经典,写文写代码
  3. 3.2 STL中的函数对象类模板
  4. CentOS6.5中修改yum源
  5. autohotkey在运维中的应用
  6. Intel&#174; RealSense™ SDK Architecture
  7. Windows服务的创建、安装、卸载
  8. 设置tableView的分割线填满cell的方式总结
  9. Lua 数组排序 table.sort的注意事项
  10. java IO(三):字符流
  11. 学习UI的总结
  12. 习题 7-3 uva211
  13. RxJava(一) create操作符的用法和源码分析
  14. Linux时间子系统之(十七):ARM generic timer驱动代码分析
  15. 前端开发中使用mac自带apache服务
  16. flask 下载本地文件
  17. redis安装,第一天
  18. 逆袭之旅DAY15.东软实训.Oracle.约束、序列、视图、索引、用户管理、角色
  19. ERP、CRM、CMS
  20. 使用PHP打造QQ空间神奇图片

热门文章

  1. 为什么有的编程规范要求用 void 0 代替 undefined
  2. React Hooks 你不来了解下?
  3. android中shape 的使用
  4. Java测试(二)
  5. 正则表达式(RegExp)
  6. mgo操作mongodb
  7. 实现一个extend函数
  8. rocketmq学习(一) rocketmq介绍与安装
  9. 搜索专题题解(FJUT - OJ 17级搜索强化训练)
  10. 深入解析 Kubebuilder:让编写 CRD 变得更简单