文档章节

cocos2d-x3.x 游戏手柄

piggybear
 piggybear
发布于 2015/02/16 10:30
字数 1563
阅读 40
收藏 0

概述

本教程将向你介绍在Cocos2d-x v3.2 rc0中如何支持iOS和Android的游戏控制器。

游戏控制器的测试

iOS

使用以下步骤测试游戏控制器

  • 打开 cocos2dx_root / cocos2d_tests.xcodeproj
  • 选择 game-controller-test
  • 在iOS设备上构建和安装
  • 将iOS设备连接到控制器,并开始 game-controller-test

Android

1
2
3
4
5
$ cd cocos2dx_root/build
$ ./android-build.py game-controller-test -p 16
$ adb connect IP_OF_TV
$ adb install ../tests/game-controller-test/proj.android //bin/GameControllerTest-debug.apk
$ adb shell am start -n org.cocos2dx.game_controller_test/.AppActivity
  • IP_OF_TV:亚马逊(Amazon)电视的ip地址,它可以在Amazon Fire TV(既是机顶盒也是游戏机)上通过Settings->SYSTEM->About->NetWork操作得到,也可以在欧雅(Ouya)上通过MANAGE->SYSTEM->ADVANCED->Wi-fi->connected wifi取得。Android设备和显影机应该在同一个网络。
  • 安装Android应用程序时不可以连接多个Android设备
  • 你应该打开adb over network。你可以在欧雅上通过MANAGE-->SYSTEM-->DEVELOPMENT-->ADB OVER NETWORK打开,也可以在Amazon Fire TV(既是机顶盒也是游戏机)上通过Settings-->SYSTEM-->Developer Options-->ADB debugging打开它。
  • 如果你想测试Nibiru,你应该在运行该测试用例之前安装相应的应用程序。

当你按下控制器设备上的任意键时,你的屏幕上对应的键就会高亮显示。如下图所示:

游戏控制器事件

在Cocos2d-x中,游戏控制器的事件监听器叫做EventListenerController。它一共有6个控制器监听事件:onConnected,onDisconnected,onKeyDown,onKeyUp,onAxisEvent和onKeyRepeat。onAxisEvent是摇杆变化时的监听事件。KeyCode指互动中键的类型。下面的列表和图片中显示了KeyCode和控制器上对应的键。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
enum Key
{
     JOYSTICK_LEFT_X = 1000,
     JOYSTICK_LEFT_Y,
     JOYSTICK_RIGHT_X,
     JOYSTICK_RIGHT_Y,
 
     BUTTON_A,
     BUTTON_B,
     BUTTON_C,
     BUTTON_X,
     BUTTON_Y,
     BUTTON_Z,
 
     BUTTON_DPAD_UP,
     BUTTON_DPAD_DOWN,
     BUTTON_DPAD_LEFT,
     BUTTON_DPAD_RIGHT,
     BUTTON_DPAD_CENTER,
 
     BUTTON_LEFT_SHOULDER,
     BUTTON_RIGHT_SHOULDER,
 
     AXIS_LEFT_TRIGGER,
     AXIS_RIGHT_TRIGGER,
 
     BUTTON_LEFT_THUMBSTICK,
     BUTTON_RIGHT_THUMBSTICK,
 
     BUTTON_START,
     BUTTON_SELECT,
 
     BUTTON_PAUSE,
     KEY_MAX
  };

p2

一个键有3种状态属性。如果isAnalog为真,那么value值将可能是一个从-1到1的浮点数。如果isAnalog为假,value将是像0或1这样确定的一个数。这些都取决于你的键和游戏控制器。举个例子:如果你的键是JOYSTICK_LEFT_X,那么其isAnalog将为真,并且value值将是一个从-1到1的代表左操纵杆X轴值的浮点数。

1
2
3
4
5
6
typedef struct _keyStatus
{
     bool isPressed;
     float value;
     bool isAnalog;
}KeyStatus;

下面的代码展示了如何在项目中使用这些事件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
void HelloWorld::registerControllerListener()
{
     //create an evnetListenerController
     _listener = EventListenerController::create();
 
     //bind onConneected event call function
     _listener->onConnected = CC_CALLBACK_2(HelloWorld::onConnectController, this );
 
     //bind disconnect event call function
         _listener->onDisconnected = CC_CALLBACK_2(HelloWorld::onDisconnectedController, this );
 
         //bind onKeyDown event call function       
         _listener->onKeyDown = CC_CALLBACK_3(HelloWorld::onKeyDown, this );
 
         //bind onKeyUp event call function  
         _listener->onKeyUp = CC_CALLBACK_3(HelloWorld::onKeyUp, this );
 
         //bind onAxis event call function, onAxis will be called when analog stick is changed
         _listener->onAxisEvent = CC_CALLBACK_3(HelloWorld::onAxisEvent, this );
 
     //Activate the listener into the event dispatcher
         _eventDispatcher->addEventListenerWithSceneGraphPriority(_listener, this );
 
     //This function should be called for iOS platform
     Controller::startDiscoveryController();
}
 
//Controller is the obejects of the Controller,keyCode means the keycode of the controller you click down
void HelloWorld::onKeyDown(cocos2d::Controller *controller, int keyCode, cocos2d::Event *event)
{
     CCLOG( "KeyDown:%d" , keyCode);
}  
 
void HelloWorld::onKeyUp(cocos2d::Controller *controller, int keyCode, cocos2d::Event *event)
{
     //You can get the controller by tag, deviceId or devicename if there are multiple controllers
     CCLOG( "tag:%d DeviceId:%d DeviceName:%s" , controller->getTag(), controller->getDeviceId(), controller->getDeviceName().c_str());
     CCLOG( "KeyUp:%d" , keyCode);
}
 
//The axis includes X-axis and Y-axis and its range is from -1 to 1. X-axis is start from left to right and Y-axis is bottom to top.
void HelloWorld::onAxisEvent(cocos2d::Controller* controller, int keyCode, cocos2d::Event* event)
{
     const auto& keyStatus = controller->getKeyStatus(keyCode);
     CCLOG( "Axis KeyCode:%d Axis Value:%f" , keyCode, keyStatus.value);
}  
 
void HelloWorld::onConnectController(Controller* controller, Event* event)
{          
     CCLOG( "Game controller connected" );
}
 
void HelloWorld::onDisconnectedController(Controller* controller, Event* event)
{
     CCLOG( "Game controller disconnected" );
}
 
bool HelloWorld::init()
{
     //////////////////////////////
     // 1. super init first
     if ( !Layer::init() )
     {
         return false ;
     }      
     ......
     ......         
      registerControllerListener();
 
     return true ;
}

如何将游戏控制器集成到iOS设备

1.连接设备

为了在iOS设备上支持游戏控制器,你需要iOS 7.0以上的系统,并且还需要将控制器连接到你的iOS设备上。我们现在支持标准的iOS游戏控制器。不同的设备可通过类似的方法链接(请阅读游戏控制器的说明书)。在这个示例中,我们使用支持iPhone 5/5C/5s和第五代iPod touch的PowerShell。连接PowerShell是很容易的,插入你的设备就可以了。

2.添加GameController.Framework

如果你是一个新手,并且不知道如何在iOS上创建一个Cocos2d-x项目,那么请先阅读How_to_Start_A_New_Cocos2D-X_Game一文。紧接着你就可以添加GameController.Framework(iOS 7.0以上)了。如下图所示:

p3

3.写下你的控制器事件

读取游戏控制器事件并在程序中编写自己的代码。然后在实际的设备上运行它。

注意:必须调用Controller::startDiscoveryController()方法,否则控制器将是无效的。我们建议你把它放在初始化函数中。

如何将游戏控制器集成到Android设备

1.连接设备

请阅读游戏控制器说明书来连接游戏控制器。Cocos2d-x v3.2支持标准的安卓游戏控制器、欧雅电视(Ouya TV)控制器、亚马逊防火电视(Amazon fire TV)控制器、莫加(Moga)控制器以及尼比奴(Nibiru)控制器。下面我们选择Nibiru的Android游戏控制器作为示例,为控制器的驱动程序下载并安装apk文件,然后打开应用程序来链接游戏手柄。

p4

2.添加libControllerManualAdapter

如果你是一个新手,并且不知道如何在Android上创建一个Cocos2d-x项目,那请先阅读How_to_Build_an_Android_Project_with_Eclipse。游戏控制器部分的功能集成在一个叫做libControllerManualAdapter的独立lib上,使用时你必须将这个lib添加到你的eclipse安卓项目中。其路径是Cocos2d-x path/platform/android/ControllerManualAdapter,它只能在Android SDK 4.1.2以上编译。

p5

3.修改AppActivity.java

按照下面的示例修改AppActivity.java文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import org.cocos2dx.lib.GameControllerActivity;
import android.os.Bundle;
 
public class AppActivity extends GameControllerActivity {
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {       
         super.onCreate(savedInstanceState);
 
         //The standard controller,without doing anything special. e.g: Amazon Fire TV  
         //Manually specify an adapter.
         this .connectController(DRIVERTYPE_NIBIRU);
         //this.connectController(DRIVERTYPE_MOGA);
         //this.connectController(DRIVERTYPE_OUYA);
     }
}

4.编译并运行

转自:http://cn.cocos2d-x.org/tutorial/show?id=1166

本文转载自:http://blog.csdn.net/aa294194253/article/details/38658225

共有 人打赏支持
piggybear
粉丝 3
博文 237
码字总数 37552
作品 0
西安
技术主管
游戏示例的源码有错误

我按《cocos2d-x 3.x 游戏开发之旅》这本书的一个游戏示例敲的代码,也从作者的网站上下了示例源码看了,没有发现代码的问题。 我是Xcode7.3,cocos2d-x3.x但是编译的时候出现了问题,开始的...

光明使者___
2016/06/05
311
0
Cocos2d-x 3.2.0 正式版发布,新增集成开发环境

Cocos2d-x 3.2.0 正式版发布,从该版本开始你可以使用 3D 骨架动画来创建 3D 形象,你可以让你的 Cocos2d-x 游戏适应 iOS 和 Android 系统;引入新的产品 —— Code IDE,支持 Lua 和 JavaSc...

oschina
2014/07/20
12.1K
23
《Cocos2d-x实战 C++卷》上线了-源码-样章-感谢大家的支持

《Cocos2d-x实战 C++卷》上线了 感谢大家一直以来的支持! 全面介绍Cocos开发技巧,采用Cocos2d-x3.2版本,并且详细介绍跨平台移植已经多平台发布细节。 · 各大商店均开始销售: 京东:htt...

智捷课堂
2014/12/01
0
0
cocos2d-x游戏《StopGMO》现阶段成品及代码发布

《StopGMO》,就是我第一篇博文中提到的《兔子大战转基因(蔬菜)》。它原本是个flash游戏(http://wanga.me/25523)。我克隆(山寨)它是因为我在学cocos2d-x的时候刚好玩了这个游戏,并且觉...

萝卜胡
2013/01/06
0
16
《兔子大战转基因》的副产物 -- 两个cocos2dx游戏的源代码分享

之前,我一直没有打算过要搞手机游戏。直到最近发现自己还没有能力做一个好玩的PC游戏,而又想有点满足感,所以还是决定先尝试学一下手机游戏开发,了解一下一个游戏的基本架构。 于是,在前...

萝卜胡
2013/01/05
0
18

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spring Cloud Gateway真的有那么差吗?

前言 Spring Cloud从一开始最受大家质疑的就是网关性能,那是由于Spring Cloud最初选择了使用Netflix几年前开源的Zuul作为基础,而高性能版的Zuul 2在经过了多次跳票之后,对于Spring这样的整...

Java小铺
38分钟前
1
0
SpringBoot远程调试,远程debug你的线上项目

开发环境中代码出错了,可以利用IDE的debug功能来进行调试。那线上环境出错呢? 一、假设我们的项目是部署在tomcat中,那我们就需要对tomcat进行一定对配置,配置如下。 1. windows系统中,找...

nonnetta
43分钟前
0
0
JAVA秒杀优化方向

秒杀优化方向 将请求尽量拦截在系统上游:传统秒杀系统之所以挂,请求都压倒了后端数据层,数据读写锁冲突严重,几乎所有请求都超时,流量虽大,下单成功的有效流量甚小,我们可以通过限流、...

小贱是个程序员
51分钟前
0
0
C# 统计字符串中大写字母和小写字母的个数

static void Main() { int count1 = 0; int count2 = 0; Console.WriteLine("请输入字符串"); string str = Convert.ToString(Consol......

熊二的爸爸是谁
53分钟前
0
0
分布式服务框架之远程通讯技术及原理分析

在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如:RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS等,这些名词之间到底是...

老道士
59分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部