【问题标题】:End Match if Home Button is Pressed如果按下主页按钮则结束比赛
【发布时间】:2011-05-30 00:30:16
【问题描述】:

如果按下设备上的主页按钮,我将如何结束比赛/断开对面玩家的连接和/或移除比赛制作器标准界面 (GameKit)?我在屏幕上还有一个“主菜单”按钮,如果按下它,我想结束比赛/断开对方玩家的连接。我正在使用 GameKit 来查找和开始比赛。

我是多人游戏新手,因此感谢您的帮助。

-(void) match:(GKMatch*)match player:(NSString*)playerID didChangeState:(GKPlayerConnectionState)state
{
    switch (state)
    {
        case GKPlayerStateConnected:
            [delegate onPlayerConnected:playerID];
            break;
        case GKPlayerStateDisconnected:
            CCLOG(@"Disconnected");
            [delegate onPlayerDisconnected:playerID];
            break;
    }

    if (matchStarted == NO && match.expectedPlayerCount == 0)
    {
        matchStarted = YES;
        [delegate onStartMatch];
    }
}


-(void) disconnectCurrentMatch
{
    CCLOG(@"Quit Match");
    [currentMatch disconnect];
    currentMatch.delegate = nil;
    [currentMatch release];
    currentMatch = nil;
}

这就是我用来断开玩家连接的全部内容。然后当玩家按下“主菜单”按钮时,这就是代码。

-(void)Menu: (id) sender
{
    didQuit = YES;

    if (isSingle == YES)
    {
        GameKitHelper* gkHelper = [GameKitHelper sharedGameKitHelper];
        [gkHelper disconnectCurrentMatch];
        gkHelper.delegate = nil;
    }

    [[CCDirector sharedDirector] replaceScene: [MainMenu scene]];
    CCLOG(@"Return Main Menu");
}

它将场景替换为主菜单,但不会将状态更改为断开连接。

【问题讨论】:

  • 您是否在 (isSingle == YES) 代码上放置了断点以确保正在执行逻辑?
  • 如果你的意思是“break;”我不能因为它不在循环或开关中,但我确实添加了一个“CCLOG”来检查,是的,它被调用了。我还在“disconnectCurrentMatch”中添加了另一个检查,当我按下游戏中的主菜单按钮时会调用它。
  • hmm..你怎么知道它没有断开连接?当你改变场景时它会自动断开连接?没有?
  • 不,我的意思是 Xcode 断点——在该点停止执行并检查发生了什么。但是,如果您确定 isSingle == YES 那就没问题了。这就是我想确认的。这个方法有什么:[delegate onPlayerDisconnected:playerID];
  • 只是 "CCLOG(@"onPlayerDisconnected: %@", playerID);"告诉哪个玩家已断开连接。我发现除非我点击主菜单按钮然后返回开始另一场比赛,否则状态不会改变。然后调用“onPlayerDisconnected”并再次调用“onPlayerConnected”。我也在使用模拟器和我的设备来测试多人游戏。

标签: cocoa-touch ios cocos2d-iphone gamekit


【解决方案1】:

乔恩,

按下主页按钮时,您的应用程序委托将收到-(void)applicationDidEnterBackground:(UIApplication*)application 回调。

您有大约 5 秒的时间(在 Springboard 终止您的应用程序之前)执行您需要做的任何事情来清理您的应用程序(除非您需要更多时间,您可以从 iOS 请求,但不能保证会收到)。

你如何“清理”?正如您所提到的 - 您的比赛有 2 名玩家,因此玩家断开连接或退出对游戏的影响相同 - 结束游戏(假设玩家无法继续自己玩)。

您的离开玩家将向 GameKit 发送 -disconnect 消息。

玩家留下的程序需要有一个符合GKMatchDelegate协议的对象,并作为GKMatch的代理接收回调。

当对方玩家断开连接时,GKMatch 将调用代表:

- (void)match:(GKMatch *)match player:(NSString *)playerID didChangeState:(GKPlayerConnectionState)state`

所以,现在您的被遗忘代码的玩家也会收到通知。在该方法中,检查它是否断开连接 - 如果是,请按照您自己的逻辑来确定玩家“挂断”时想要发生的事情。

【讨论】:

  • 我使用的是Cocos2d,所以当按下home键时它会自动暂停游戏。所以,我添加了一个 BOOL 来检查它是否在多人游戏中(当场景被替换为多人游戏时 isMP = YES,当场景被替换为单人游戏时 isMP = NO)。在 applicationWillTerminate 和 applicationDidEnterBackground 我添加了一个检查 "if (isMP == YES) { //cancel match }" 但我无法找出在这些括号之间放置什么来取消匹配和/或删除标准匹配器接口.我似乎也无法在 API 文档中找到它。我知道这可能只是一行代码。
  • 不确定用例,但这不是你想要的:developer.apple.com/library/ios/#documentation/GameKit/… ?
  • 我试过了,它并没有断开玩家的连接,也没有通知对方玩家他们已断开连接,我被难住了。
  • 在断开连接时通知对方玩家不是您的责任 - 这是对方玩家的实现应该通过他们将在您断开连接时收到的委托回调。
  • 乔恩 - 忘记了一件重要的事情。你的游戏只能两个人玩吗?
猜你喜欢
  • 1970-01-01
  • 2018-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多