iOS 7+ 手柄的使用方法,GameController.FrameWork

笔者昨天买回了G550 ,也就是 Logitech 的iOS 的手柄,支持iPhong 5 / iPhone 5s / iTouch 5 等等

最近在捣鼓个东西,之前也说过要学习Cocos2dx,手柄到了以后先找了几个游戏 试试感觉还不错。


之后链接xCode看GameController.frameWork


现在个大网站查关于手柄控制的资料。。。基本无功而返。


看过官方文档以后。使用方法如下


手柄使用无非是连接手柄,识别手柄,读取手柄按键。


一.导入GameController.FrameWork,在需要使用的代码中包含 GameController/GameController.h


二.检测手柄连接

注意:手柄类也就是GameController 或者 GamePad这样的类是不需要自己Alloc,手柄对象的生存周期由系统控制


SDK中检测到手柄连接\断开会发送通知,通知名分别为


GCControllerDidConnectNotification : 连接

GCControllerDidDisconnectNotification : 断开


你可以在viewDidLoad里面这样写

[[NSNotificationCenterdefaultCenter]addObserver:selfselector:@selector(gamPadConnection:)name:GCControllerDidConnectNotificationobject:Nil];

[[NSNotificationCenterdefaultCenter]addObserver:selfselector:@selector(gamPadDisconnection:)name:GCControllerDidDisconnectNotificationobject:Nil];


这样当检测到手柄时候在gamPadConnection:这个方法里就能获取相关信息了。


三.识别手柄

上面说了我们关注了通知name:GCControllerDidConnectNotification而后我们连接手柄,降调用gamePadConnection,你可以这样写


- (void) gamPadConnection : (NSNotification*) info
{
    if ([info.object isKindOfClass:[GCController class]])
    {
        gamePadController = info.object;
        gamePadController.playerIndex = 0;
    };
}

代码中的info.object就是手柄


GCController *gamePadController;


你可以在你觉得需要的地方保存这个手柄对象.至于gamePadController.palyerIndex = 0 这段代码,手柄是可以多人联机的。API中有关于无线手柄的概念,或许在同一个设备上连接多个手柄的功能。这个playerIndex 就是表示玩家的Index,简单的说,就是手柄编号,0 表示 是主手柄。



四.检测手柄按键

其实手柄按键的概念大概都是这样的.举例如果手柄上由10个按键那么肯定由一个 类似int Pad = 0; 而后一个int 假设是 16Bit。那么每一位表示一个按键。用该为的 0 或者 1 表示按键是否按下。


其实上面这句话和下面的内容没有什么关系- -|


如何读取。直接看代码,首先我们说怎么读取手柄上的 A,B,X,Y 

gamePadController.gamepad.rightShoulder.pressed

gamePadController.gamepad.buttonA.pressed


等等......


比较简单。你也可以使用手柄内置的KVO模式做按键。每个按键都能设置 ValueChangedHandler 这是一个函数指针,如果你不知道什么是函数指针,你就理解为他是Block,


A,B,X,Y,LB,RB这些按键比较简单。


关键在于如果判定方向键.你仔细看看手柄上面的方向按键,他是一个十字键,什么意思呢,比如你单纯的按下RIGHT,你认为只有RIGHT按下去了吗?NO 其实 RIGHT 按下 UP,DOWN 也多多少少的被按下去了.在打个比方UP按下 LEFT RIGHT 也将多多少少被按下了。


怎么解决这个问题呢...还好SDK给我们提供了比较方便的方法。


gamePadController.gamepad.dpad.xAxis.value (-1,1)的区间方便表示了 左右


gamePadController.gamepad.dpad.yAxis.value(-1,1)的区间方便表示了 上下


再次贴上笔者的判键方法


#define GAMEPAD_SPL (150)
    
    int xValue = gamePadController.gamepad.dpad.xAxis.value * 1000;
    int yValue = gamePadController.gamepad.dpad.yAxis.value * 1000;
    
    controls.pad[0].buttons = 0;
    
    if (xValue > GAMEPAD_SPL)
    {
        //right
    }
    else if (xValue < -GAMEPAD_SPL)
    {
        //left
    }
    
    if (yValue > GAMEPAD_SPL)
    {
        //up
    }
    else if (yValue < -GAMEPAD_SPL)
    {
        //down
    }



笔者对见在每次游戏或者你的程序update 的时候去检测所有按键,来控制你的游戏状态..如果使用手柄的KVO,效率就无法保证了........而且可能会导致各种各样的问题。。


以上。。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值