概述
本教程将向你介绍在Cocos2d-x v3.2 rc0中如何支持iOS和Android的游戏控制器。
游戏控制器的测试
iOS
使用以下步骤测试游戏控制器
Android
12345 | $ cd cocos2dx_root/build $ ./android-build.py game-controller-test -p16 $ adb connect IP_OF_TV $ adb install../tests/game-controller-test/proj.android //bin/GameControllerTest-debug.apk $ adb shell am start -norg.cocos2dx.game_controller_test/.AppActivity |
当你按下控制器设备上的任意键时,你的屏幕上对应的键就会高亮显示。如下图所示:
游戏控制器事件
在Cocos2d-x中,游戏控制器的事件监听器叫做EventListenerController。它一共有6个控制器监听事件:onConnected,onDisconnected,onKeyDown,onKeyUp,onAxisEvent和onKeyRepeat。onAxisEvent是摇杆变化时的监听事件。KeyCode指互动中键的类型。下面的列表和图片中显示了KeyCode和控制器上对应的键。
1234567891011121314151617181920212223242526272829303132333435 | 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
}; |
一个键有3种状态属性。如果isAnalog为真,那么value值将可能是一个从-1到1的浮点数。如果isAnalog为假,value将是像0或1这样确定的一个数。这些都取决于你的键和游戏控制器。举个例子:如果你的键是JOYSTICK_LEFT_X,那么其isAnalog将为真,并且value值将是一个从-1到1的代表左操纵杆X轴值的浮点数。
123456 | typedef struct _keyStatus {
bool isPressed;
float value;
bool isAnalog; }KeyStatus; |
下面的代码展示了如何在项目中使用这些事件。
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 | void HelloWorld::registerControllerListener() {
//createan evnetListenerController
_listener= EventListenerController::create();
//bindonConneected event call function
_listener->onConnected=CC_CALLBACK_2(HelloWorld::onConnectController, this );
//binddisconnect event call function
_listener->onDisconnected=CC_CALLBACK_2(HelloWorld::onDisconnectedController, this );
//bindonKeyDown event callfunction
_listener->onKeyDown= CC_CALLBACK_3(HelloWorld::onKeyDown, this );
//bindonKeyUp event callfunction
_listener->onKeyUp= CC_CALLBACK_3(HelloWorld::onKeyUp, this );
//bindonAxis event call function, onAxis will be called when analog stickis changed
_listener->onAxisEvent= CC_CALLBACK_3(HelloWorld::onAxisEvent, this );
//Activatethe listener into the event dispatcher
_eventDispatcher->addEventListenerWithSceneGraphPriority(_listener, this );
//Thisfunction should be called for iOS platform
Controller::startDiscoveryController(); } //Controller is the obejects of the Controller,keyCodemeans 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) {
//Youcan get the controller by tag, deviceId or devicename if there aremultiple controllers
CCLOG( "tag:%dDeviceId:%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 isfrom -1 to 1. X-axis is start from left to right and Y-axis isbottom to top. void HelloWorld::onAxisEvent(cocos2d::Controller*controller, int keyCode, cocos2d::Event*event) {
const auto& keyStatus =controller->getKeyStatus(keyCode);
CCLOG( "AxisKeyCode:%d Axis Value:%f" , keyCode,keyStatus.value); } void HelloWorld::onConnectController(Controller* controller,Event* event) {
CCLOG( "Gamecontroller connected" ); } void HelloWorld::onDisconnectedController(Controller* controller,Event* event) {
CCLOG( "Gamecontroller disconnected" ); } bool HelloWorld::init() {
//////////////////////////////
//1. super init first
if ( !Layer::init() )
{
return false ;
}
......
......
registerControllerListener();
return true ; } |
如何将游戏控制器集成到iOS设备
1.连接设备
为了在iOS设备上支持游戏控制器,你需要iOS7.0以上的系统,并且还需要将控制器连接到你的iOS设备上。我们现在支持标准的iOS游戏控制器。不同的设备可通过类似的方法链接(请阅读游戏控制器的说明书)。在这个示例中,我们使用支持iPhone 5/5C/5s和第五代iPodtouch的PowerShell。连接PowerShell是很容易的,插入你的设备就可以了。
2.添加GameController.Framework
如果你是一个新手,并且不知道如何在iOS上创建一个Cocos2d-x项目,那么请先阅读How_to_Start_A_New_Cocos2D-X_Game一文。紧接着你就可以添加GameController.Framework(iOS7.0以上)了。如下图所示:
3.写下你的控制器事件
读取游戏控制器事件并在程序中编写自己的代码。然后在实际的设备上运行它。
注意:必须调用Controller::startDiscoveryController()
方法,否则控制器将是无效的。我们建议你把它放在初始化函数中。
如何将游戏控制器集成到Android设备
1.连接设备
请阅读游戏控制器说明书来连接游戏控制器。Cocos2d-x v3.2支持标准的安卓游戏控制器、欧雅电视(OuyaTV)控制器、亚马逊防火电视(Amazon fireTV)控制器、莫加(Moga)控制器以及尼比奴(Nibiru)控制器。下面我们选择Nibiru的Android游戏控制器作为示例,为控制器的驱动程序下载并安装apk文件,然后打开应用程序来链接游戏手柄。
2.添加libControllerManualAdapter
如果你是一个新手,并且不知道如何在Android上创建一个Cocos2d-x项目,那请先阅读How_to_Build_an_Android_Project_with_Eclipse。游戏控制器部分的功能集成在一个叫做libControllerManualAdapter的独立lib上,使用时你必须将这个lib添加到你的eclipse安卓项目中。其路径是Cocos2d-xpath/platform/android/ControllerManualAdapter
,它只能在AndroidSDK 4.1.2以上编译。
3.修改AppActivity.java
按照下面的示例修改AppActivity.java文件。
12345678910111213141516 | importorg.cocos2dx.lib.GameControllerActivity; import android.os.Bundle; public class AppActivityextends GameControllerActivity {
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//Thestandard controller,without doing anything special. e.g: AmazonFire TV
//Manuallyspecify an adapter.
this .connectController(DRIVERTYPE_NIBIRU);
//this.connectController(DRIVERTYPE_MOGA);
//this.connectController(DRIVERTYPE_OUYA);
} } |