交互

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

键盘监听

响应

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);

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



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

cocos2d-x 系统学习cocos(2) 交互的更多相关文章

  1. cocos2d-x 系统学习cocos(1)

    简析HelloWorld场景 以前使用cocos2d-x 3.14的时候,HelloWorld并不是一个场景类,而是一个图层类,当时的HelloWorld::createScene()是长这样的 Sc ...

  2. 学习cocos 空程序

    今天开始学习cocos代码,首先研究源码中的空程序. 在这个程序中,在main函数中,创建了一个Application: int APIENTRY _tWinMain(HINSTANCE hInsta ...

  3. Dubbo -- 系统学习 笔记 -- 入门

    Dubbo -- 系统学习 笔记 -- 目录 入门 背景 需求 架构 用法 入门 背景 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行, ...

  4. 零基础如何系统学习Java Web

    零基础如何系统学习Java Web?   我来给你说一说 你要下决心,我要转行做开发,这样你才能学成. 你要会打字,我公司原来有一个程序员,打字都是两个手一指禅,身为程序员你一指禅怎么写出的代码,半个 ...

  5. Unity3D 装备系统学习Inventory Pro 2.1.2 基础篇

    前言 前一篇 Unity3D 装备系统学习Inventory Pro 2.1.2 总结 基本泛泛的对于Inventory Pro 这个插件进行了讲解,主要是想提炼下通用装备系统结构和类体系.前两天又读 ...

  6. MES系统学习

    MES系统是当今制造型企业信息化的热点,而统一建模语言UML是面向对象建模的标准语言,在软件工程发挥着重要作用.MES系统如何进行UML建模呢,今天和大家重点讨论一下MES系统的UML建模方法,请看本 ...

  7. 001 今天开始系统学习C#

    2016-01-16 之前只是大概了解过c#语言,感觉掌握不牢靠.现在开始系统学习C#.现以该博客作为学习笔记,方便后续查看.C# 目标:系统掌握c#知识 时间:30天 范围:C#基础,Winform ...

  8. Linux系统学习笔记:文件I/O

    Linux支持C语言中的标准I/O函数,同时它还提供了一套SUS标准的I/O库函数.和标准I/O不同,UNIX的I/O函数是不带缓冲的,即每个读写都调用内核中的一个系统调用.本篇总结UNIX的I/O并 ...

  9. Swift - 访问通讯录联系人(使用系统提供的通讯录交互界面)

    1,通讯录访问介绍 通讯录(或叫地址簿,电话簿)是一个数据库,里面储存了联系人的相关信息.要实现访问通讯录有如下两种方式: (1)AddressBook.framework框架 : 没有界面,通过代码 ...

随机推荐

  1. Vert.x Web 文档手册

    Vert.x Web 中英对照表 Container:容器 Micro-service:微服务 Bridge:桥接 Router:路由器 Route:路由 Sub-Route: 子路由 Handler ...

  2. 时钟AnalogClock和DigitalClock

    <AnalogClock android:layout_width="fill_parent" android:layout_height="fill_parent ...

  3. Android 网络通信框架Volley(二)

    Volley提供2个静态方法: public static RequestQueue newRequestQueue(Context context) {} public static Request ...

  4. Flink入门宝典(详细截图版)

    本文基于java构建Flink1.9版本入门程序,需要Maven 3.0.4 和 Java 8 以上版本.需要安装Netcat进行简单调试. 这里简述安装过程,并使用IDEA进行开发一个简单流处理程序 ...

  5. 浮动后的 <li> 如何在 <ul> 中居中显示?

    百度了许久都没有满意的解决方案,现在终于搞定了. 其实,只要 ul 的父元素 css 样式设了 text-align: center; 然后 ul 设了 display: inline-block; ...

  6. mysql简易导入excel

    方法-:利用excel本身的命令实现: 1 将excel文件中的数据转换成sql文件 (1)如图所示,我们在excel中执行如下语句 =CONCATENATE(“insert into table_n ...

  7. (二)spring 高级装配-Condition -条件化的bean

    Condition:满足某个特定条件的情况下创建bean 条件化配置bean: a:@Conditional 指定一个class ,它指明了通过条件对比的类.如果没有指定class则通过Condito ...

  8. JavaScript自动播放背景音乐

    问题描述 js控制audio自动播放音乐时报错: Uncaught (in promise) DOMException 我的报错之前的代码: <audio id="myaudio&qu ...

  9. 修改zabbix的端口号

    1.前言 zabbix-server的默认端口号是10051.如果存在端口号冲突,需要更改端口号. 以下为更改端口号的步骤. 2.更改配置文件  通常用安装包,也就是yum方式部署的话,其默认的配置文 ...

  10. IDEA加密算法(含所需jar包(commons-codec-1.11.jar ,bcprov-jdk15on-160.jar))

    软件设计上机实验IDEA算法: import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.Se ...