交互

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

键盘监听

响应

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. Mysql高手系列 - 第9篇:详解分组查询,mysql分组有大坑!

    这是Mysql系列第9篇. 环境:mysql5.7.25,cmd命令中进行演示. 本篇内容 分组查询语法 聚合函数 单字段分组 多字段分组 分组前筛选数据 分组后筛选数据 where和having的区 ...

  2. Nuget打包类库及引用

    什么是nuget 适用于任何现代开发平台的基本工具可充当一种机制,通过这种机制,开发人员可以创建.共享和使用有用的代码. 通常,此类代码捆绑到"包"中,其中包含编译的代码(如 DL ...

  3. F#周报2019年第38期

    新闻 宣告.NET Core 3.0第一个候选版本 .NET Core 3.0第一个候选版本中ASP.NET Core与Blazor的更新 F#的就业市场情形如何 Finalization实现细节 G ...

  4. 使用Hexo搭建个人博客并部署到GitHub或码云上全过程

    一.前言 如上图所示:GitHub有Github Pages,而码云也有码云 Pages 1.Github Pages或Gitee Pages是什么呢? Github Pages或者Gitee Pag ...

  5. hibernate集成ehcahe进行缓存管理

    ehcace是现在非常流行的缓存框架,有轻量.灵活.可扩展.支持集群/分布式等优点. 在项目中,使用ehcace可以对数据进行缓存(一般使用.基于注解.基于aop),使用filter可以对页面进行缓存 ...

  6. 初学Spring的感觉

    1.使用接口 不同的类实现同一接口后都会变成同一类型的类.   spring作业1的思路 lab1: 建立一个有一个输出方法的接口类|并建一个英语类和一个数学类实现该接口.   这两个实现类都重写了那 ...

  7. JavaScript之深入函数(二)

    上一篇我们主要讲解了函数的执行过程和原理,本篇我们将介绍函数的另外两个特殊表现:闭包和立即执行函数. 一 闭包 1,  闭包的形成 之前我们提到,函数执行完毕,马上就会销毁自己的AO对象.但是如果遇到 ...

  8. spring web 脚手架 (持续更新中...)

    spring web 脚手架 项目地址: https://github.com/MengW9/scafflod.git 还有觉得哪些可以加上去的配置,欢迎各位拍砖,我会持续更新,大家共同进步 一个通用 ...

  9. ZIP压缩和解压字符串

    由于ZIP压缩会产生头信息, 所以当字符串长度没有达到一定规模的时候, 压缩后的长度可能比原来的还长 // 将一个字符串按照zip方式压缩和解压缩 public class ZipUtil { // ...

  10. Spring MVC-从零开始-view-ViewResolver

    主要ViewResolver简介 InternalResourceViewResolver 将逻辑视图名解析为一个路径 BeanNameViewResolver 将逻辑视图名解析为bean的name属 ...