Objective c 使用GameKitHelper-cocos2d委派问题

Objective c 使用GameKitHelper-cocos2d委派问题,objective-c,cocos2d-iphone,Objective C,Cocos2d Iphone,我可能想得太多了,但我已经坚持了一段时间,所以我想我应该寻求一些建议/帮助 我正在使用GameKitHelper(),到目前为止,它非常有用。因此,我在我的“主菜单”中初始化了helper,并实现了协议,等等: @interface MainMenu : CCLayer <GameKitHelperProtocol> { ... GameKitHelper *gkHelper; } 看起来很难前进。事实上,它是有效的,正如我所期望的那样。我有它希望在那里使用的方法(

我可能想得太多了,但我已经坚持了一段时间,所以我想我应该寻求一些建议/帮助

我正在使用GameKitHelper(),到目前为止,它非常有用。因此,我在我的“主菜单”中初始化了helper,并实现了协议,等等:

@interface MainMenu : CCLayer <GameKitHelperProtocol> {
    ...
    GameKitHelper *gkHelper;
}
看起来很难前进。事实上,它是有效的,正如我所期望的那样。我有它希望在那里使用的方法(尽管大多数方法还没有与它们相关联的代码)。我的问题是什么时候我真的想开始我的比赛。因此,我使用onMatchFind()启动游戏,它基本上可以工作:

-(void) onMatchFound:(GKMatch*)match
{    
    [[CCDirector sharedDirector] replaceScene:[CCTransitionFade transitionWithDuration:1.2f scene: [[MultiplayerLoading initWithData:Multiplayer withMultiplayerType:gameTypeToPlay andInitiator:false] scene]]];

}
我的问题是,当我尝试玩游戏时,主菜单中的receive delete方法而不是game类中的方法会触发,因此无法正确计算。 当onMatchFound启动时,有没有办法将控制权从主菜单传递给游戏层

希望这能提供足够的信息,如果没有,请告诉我


谢谢大家

这可能是因为您的主菜单设置为GameKitHelper中的代理吗?我会尝试在
onMatchFound
内将代理设置为游戏。试一试。

有两种方法可以让它发挥作用。一种方法是使用全局单例类作为GameKitHelper委托。然后,您可以通过这个单例类中继消息

或者简单地将新场景指定为GameKitHelper代理:

-(void) onMatchFound:(GKMatch*)match
{   
    CCScene* newScene = [MyNewScene scene];
    [GameKitHelper sharedGameKitHelper].delegate = newScene;
    [[CCDirector sharedDirector] replaceScene:newScene];
}

此外,您创建新场景的方式似乎有问题:

[[MultiplayerLoading initWithData:Multiplayer
              withMultiplayerType:gameTypeToPlay 
                     andInitiator:false] scene];
看起来您首先调用init方法,然后调用分配实例的class方法
scene
(请参见场景实现)。在我看来,它应该是:

[[[MultiplayerLoading alloc] initWithData:Multiplayer 
                      withMultiplayerType:gameTypeToPlay 
                             andInitiator:false] autorelease];
[[[MultiplayerLoading alloc] initWithData:Multiplayer 
                          multiplayerType:gameTypeToPlay 
                                initiator:false] autorelease];
顺便说一句,建议不要用“and”关键字“link”方法参数,并且多次使用“with”也是很奇怪的。清理它应该是:

[[[MultiplayerLoading alloc] initWithData:Multiplayer 
                      withMultiplayerType:gameTypeToPlay 
                             andInitiator:false] autorelease];
[[[MultiplayerLoading alloc] initWithData:Multiplayer 
                          multiplayerType:gameTypeToPlay 
                                initiator:false] autorelease];

请原谅我太挑剔了

是的,但我并没有真正找到一种不让主菜单作为代表的方法。当比赛进行时,比赛发起人都很兴奋,工作正常,但是如果获得邀请的人不在游戏中,代理就不会加入,所以他们基本上是无用的。当你收到邀请时,它会把你带到游戏中,但是如果代理不在主菜单上,它就会坐在那里,因为它没有onMatchFound的东西可以激发。我感谢人们对我的代码挑剔!我将尝试这些更改并报告!谢谢好的,我把它改成你说的,但是现在当在类中接收数据时(多层加载),它崩溃了:“NSInvalidArgumentException”,原因:“+[MultiplayerLoading onReceivedData:fromPlayer:::发送到类的未识别选择器在开始播放之前尝试接收数据包,但是它在这一点上崩溃了…想法?看来你需要实现错误消息告诉你的@selector。