Cocos2d-x 3.x 手柄调用(附Win32实现)

从3.2版本开始cocos就开始支持手柄了(EventListenerController),但官方只提供了在Android和IOS下的实现,所以使用VS的开发者调试起来不方便,我在网盘里提供了一个使用DirectInput实现Win32支持的代码(可以用鼠标、键盘模拟,也可以用真实的手柄操作)。
这里有cocos官方提供IOS和Android下手柄接入资料:http://www.cocos.com/doc/tutorial/show?id=1166

在程序调用手柄,首先需要包含 base/CCController.h 和 base/CCEventListenerController.h 两个头文件,分别是调用本地手柄游戏控制台的Controller类,和处理回调事件的EventListenerController类。
auto listener = EventListenerController::create(); // 创建手柄事件回调接口
// 设置事件回调函数(可以使用全局函数、静态成员函数、Lambda表达式或CC_CALLBACK_X宏绑定非静态成员函数等方式实现)
listener->onAxisEvent = onAxisEvent; // 轴事件回调
listener->onKeyDown = onKeyDown; //按下按键事件回调
listener->onKeyUp = onKeyUp; // 放开按键事件回调
listener->onConnected = onConnected; // 设备连接事件事件回调
listener->onDisconnected = onDisconnected; // 设备断开事件回调
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this); // 添加事件回调对象
Controller::startDiscoveryController(); // 启用游戏控制器检测(IOS和Win32下必须调用)

void onAxisEvent(Controller *controller, int code, Event *event)
{
// code 为触发该事件的轴编号
// controller->JOYSTICK_LEFT_X 为左边的X轴
// controller->JOYSTICK_LEFT_Y 为左边的Y轴

// controller->JOYSTICK_RIGHT_X 为右边的X轴(一般用于3D游戏)
// controller->JOYSTICK_RIGHT_Y 为右边的Y轴(一般用于3D游戏)

// controller->getKeyStatus(轴编号).value 用于获取某个轴的坐标(填code为当前轴)
// value 的值是 -1.f ~ 1.f,为轴所在的坐标,0.f表示处于中心
}

void onKeyDown(Controller *controller, int code, Event *event)
{
// code 为当前按下的按键键码
// controller->BUTTON_X、controller->BUTTON_Y、controller->BUTTON_A、controller->BUTTON_B 为手柄右边的4个功能键
// controller->BUTTON_DPAD_UP、controller->BUTTON_DPAD_DOWN、controller->BUTTON_DPAD_LEFT、controller->BUTTON_DPAD_RIGHT 为手柄左边的4个方向键
// controller->BUTTON_SELECT、controller->BUTTON_START 为手柄中间的选择和开始键
}

void onKeyUp(Controller *controller, int code, Event *event)
{
// code 为当前放开的按键键码(其余同上)
}

void onConnected(Controller *controller, Event *event)
{
// 设备连接事件
// controller->getDeviceName() 为获取设备名称
}

void onDisconnected(Controller *controller, Event *event)
{
// 设备断开连接,比如程序切换到后台,或USB线被拔掉等。
}

效果图如下:

Win32实现文件:http://pan.baidu.com/s/1v6LZo,1

提示Win32下手柄使用的是Cocos2d-x 3.7 版本实现,其它版本可能需要微调。CCController-win32.cpp请放到与CCController-android.cpp、CCController-iOS.mm同目录下,并添加到libcocos2d的VS项目中。
在base/CCController.cpp、 base/CCEventController.cpp、base/CCEventListenerController.cpp、base/CCEventDispatcher.cpp 这些文件中可能存在不支持平台屏蔽,如有需要手动在添加编译中添加 || CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 让Win32平台支持。
如果libcocos2d项目在Win32下为DLL库(LIB库的版本则不需要),需要base/CCController.h、 base/CCEventController.h、base/CCEventListenerController.h的class和类名之间添加 CC_DLL 宏,否则libcocos2d.dll文件将不会导出这三个类(没办法cocos官方太懒了,只能我们自己做)。

1赞