如何在 Game Center 中接受邀请

2023-11-21

我正在尝试通过游戏中心实施邀请,但有一点我不明白。好的,我已从一台设备向另一台设备发送了邀请。然后我在接收器上有一个 UIAlertView 询问我是否愿意接受或拒绝邀请。当我接受它时,它的处理方式如下:

[GKMatchmaker sharedMatchmaker].inviteHandler = ^(GKInvite *acceptedInvite, NSArray *playersToInvite) 
                 {
                     // Insert application-specific code here to clean up any games in progress.
                     if (acceptedInvite)
                     {
                         GKMatchmakerViewController *mmvc = [[[GKMatchmakerViewController alloc] initWithInvite:acceptedInvite] autorelease];
                         mmvc.matchmakerDelegate = self;
                         [presentingViewController presentModalViewController:mmvc animated:YES];
                     }
                     else if (playersToInvite)
                     {
                         GKMatchRequest *request = [[[GKMatchRequest alloc] init] autorelease];
                         request.minPlayers = 2;
                         request.maxPlayers = 4;
                         request.playersToInvite = playersToInvite;

                         GKMatchmakerViewController *mmvc = [[[GKMatchmakerViewController alloc] initWithMatchRequest:request] autorelease];
                         mmvc.matchmakerDelegate = self;
                         [presentingViewController presentModalViewController:mmvc animated:YES];

                     }
                 };

嗯,那太好了,但是接下来呢?发送者设备显然正在等待某种标准类型的响应,因为它还显示一条警报,告诉我如果我点击“立即播放”,则有一些邀请尚未答复。

那么我该如何接受邀请呢?我应该发回什么样的数据(以及如何)?我在接收方到底应该做什么?游戏应该在点击“接受”后立即开始,还是应该先关闭 AlertView,然后点击“立即玩”?

Ray Wenderlich 的教程说我应该选择第二种方式,但是当解除警报并点击“立即播放”时,事实证明发送者设备仍在等待响应并且不知道我已经接受了邀请。如果我此时点击“立即播放”,那么正如我上面所说,它会显示一条警报,表明应用程序正在等待响应。因此,如果您曾经这样做过,请解释一下我应该做什么。谢谢!


  1. 游戏加载后我就注册邀请并致电 收到邀请时委托
  2. 因此inviteReceived会调用匹配器来取消比赛 中心控制器并创建匹配
  3. 最后,当找到匹配项时,该方法 connectionStatusChanged 负责呈现游戏的所有状态 观点、球员和其他东西

这是代码:

我在游戏加载后立即注册邀请,并在收到邀请后致电委托人:

- (void)registerInvites {
    [GKMatchmaker sharedMatchmaker].inviteHandler = ^(GKInvite *acceptedInvite, NSArray *playersToInvite) {
        self.pendingInvite = acceptedInvite;
        self.pendingPlayersToInvite = playersToInvite;
        [delegate inviteReceived];
    };
}

因此,inviteReceived 会调用匹配器来关闭游戏中心控制器并创建匹配:

- (void)inviteReceived {
    [[GCMultiplayerHelper sharedInstance] findMatchWithMinPlayers:2 maxPlayers:2 viewController:(UIViewController*)[self.superview nextResponder] delegate:self];
}


- (void)findMatchWithMinPlayers:(int)minPlayers maxPlayers:(int)maxPlayers viewController:(UIViewController *)viewController delegate:(id<GCMultiplayerHelperDelegate>)theDelegate {
    if (!gameCenterAvailable) return;

    matchStarted = NO;
    self.match = nil;
    self.presentingViewController = viewController;
    delegate = theDelegate;

    [presentingViewController dismissModalViewControllerAnimated:YES];
    GKMatchmakerViewController *mmvc;

    if (pendingInvite != nil) {

        mmvc = [[[GKMatchmakerViewController alloc] initWithInvite:pendingInvite] autorelease];

    } else {

        GKMatchRequest *request = [[[GKMatchRequest alloc] init] autorelease]; 
        request.minPlayers = minPlayers;     
        request.maxPlayers = maxPlayers;
        request.playersToInvite = pendingPlayersToInvite;

        mmvc = [[[GKMatchmakerViewController alloc] initWithMatchRequest:request] autorelease];    

    }

    mmvc.matchmakerDelegate = self;
    [presentingViewController presentModalViewController:mmvc animated:YES];

    self.pendingInvite = nil;
    self.pendingPlayersToInvite = nil;
}

最后,当找到匹配时,connectionStatusChanged 方法负责显示所有游戏视图、玩家并开始匹配:

- (void)matchmakerViewController:(GKMatchmakerViewController *)viewController didFindMatch:(GKMatch *)theMatch
{
    self.match = theMatch;
    match.delegate = self;
    if (!matchStarted && match.expectedPlayerCount == 0) {
        NSLog(@"Ready to start match! - didFindMatch");
        [presentingViewController dismissModalViewControllerAnimated:YES];

        [self.delegate connectionStatusChanged:CONNECTIONSUCCESS];
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Game Center 中接受邀请 的相关文章

随机推荐

  • pytorch torchvision.datasets.ImageFolder FileNotFoundError:找不到类 .ipynb_checkpoints 的有效文件

    尝试在 Colab 中使用 pytorch torch datasets ImageFolder 加载训练数据 transform transforms Compose transforms Resize 400 transforms To
  • #include 需要在基于范围的 for 中使用初始值设定项列表吗?

    最终的 C 11 标准包括基于范围的 for 的规定 以便 仅适用于 本机数组 而无需包括
  • 让 CORS 与 Nancy 一起工作

    我正在尝试获取与 Nancy 和 CORS 合作的所有类型的请求 目前我在请求末尾添加了一个管道 pipelines AfterRequest AddItemToEndOfPipeline ctx gt ctx Response WithH
  • 为什么 Num 可以像 Fractional 一样?

    正如预期的那样 这工作得很好 foo Fractional a gt a foo undefined datum bar Num a gt a gt a bar a undefined function baz Fractional a g
  • 如何在 Fancybox 的 onComplete 事件中使用 $(this) ?

    我正在尝试使用 jQuery this Fancybox 里面onComplete事件 但我遇到了麻烦 这是我的 JavaScript 代码 a iframe fancybox centerOnScroll true onComplete
  • awk 将记录分隔符 (RS) 更改为每 2 行

    我想知道如何使用 awk 处理每两行数据而不是每一行数据 默认情况下 记录分隔符 RS 设置为每个新行 如何将其更改为每 2 行 这取决于您想要实现的目标 但一种方法是使用getline操作说明 对于每一行 读取下一行并将其保存在变量中 所
  • 如何在 Ant 目标中使用文件大小

    我目前正在用 Ant 构建脚本替换我的自制构建脚本 现在我需要用特定文件的大小替换各种标记 我知道如何通过以下方式获取大小 以字节为单位
  • Android:完成应用程序/活动后显示吐司

    我想在退出应用程序时显示一个简单的吐司 问题是 吐司没有显示 我认为这是因为活动已完成或因为System exit 0 但我不知道如何解决 有人有提示吗 谢谢 在我的活动中 我有以下代码 Toast makeText this Exit a
  • 子进程中“shell=True”的实际含义

    我正在调用不同的进程subprocess模块 不过 我有一个问题 在下面的代码中 callProcess subprocess Popen ls l shell True and callProcess subprocess Popen l
  • Ajax / Jquery 自动完成 JSON 数据

    我正在尝试设置 Jquery UI 自动完成字段以获取来自 ajax 连接的数据 到目前为止 这是我的代码 mainIngredientAutoComplete autocomplete source function request re
  • Antora顶部导航栏定制

    我的问题很简单 尽管我在文档中找不到任何指向它的内容 我正在使用 Antora 中的默认生成器为项目生成文档 但我不知道如何自定义顶部导航栏 右侧的项目 这些项目有一些默认值 既然网站已生成 我应该在哪里更改或如何更改这些项目 我不想在那里
  • 原始类型的 Objective-c 属性

    在 Objective C 中 为原始类型指定一个属性是否有意义 nonatomic 我想知道这两个属性之间的区别 property nonatomic BOOL myBool property BOOL myBool 从技术上讲 答案是肯
  • 计算两行之间的时间差

    我有一个包含 StartDate 列的表 我想计算两个连续记录之间的时间差 Thanks Mark Byers 和 Yahia 我有请求表作为 requestId startdate requestId startdate 1 2011 1
  • 使用完整网址时 PHP file_get_contents 非常慢

    我正在使用一个脚本 最初不是我创建的 该脚本从 HTML 页面生成 pdf 文件 问题是现在需要很长的时间来处理 比如 1 2 分钟 据说这最初工作得很好 但在过去几周内速度减慢了 该脚本调用file get contents在 php 脚
  • 用户与 uiview 和动画完成块的交互

    我有以下代码 UIView animateWithDuration 2 0 delay 0 0 options UIViewAnimationOptionAllowUserInteraction animations imageView b
  • 500内部服务器错误,如何调试[重复]

    这个问题在这里已经有答案了 我的 POST 请求出现内部服务器错误 我该如何调试它们 是在 php ini 中设置的吗 该文件非常大 并且多次出现 错误 一词 您可以使用以下命令打开 PHP 错误error reporting error
  • 如何在 angularJS 中将 X-Frame-Options 设置为响应标头?

    我在 API 的响应中收到了 X Frame Options 标头 但据我了解 为了防止点击劫持攻击 我需要将其添加到 UI 代码中 UI代码 用angularjs编写 部署在Tomcat 版本7 0 72 服务器中 我尝试在应用程序的 w
  • 一个动态规划问题

    谁能帮我找到一个最佳的动态规划算法这个问题 在去吃晚饭的路上 CCC 的参赛者正在排队享用美味的炸薯条 N 1 N 100 名选手排成一队进入食堂 CCC 的负责人 V 博士在最后一刻意识到 程序员只是讨厌站在使用不同语言的程序员旁边 值得
  • GraphQL 枚举类型会自动解析它们的值吗?

    我应该期望枚举类型自动解析还是这些类型仅存在以限制选项 给定以下 GraphQL 架构 type Job description String status Status enum Status PENDING REVIEW PENDING
  • 如何在 Game Center 中接受邀请

    我正在尝试通过游戏中心实施邀请 但有一点我不明白 好的 我已从一台设备向另一台设备发送了邀请 然后我在接收器上有一个 UIAlertView 询问我是否愿意接受或拒绝邀请 当我接受它时 它的处理方式如下 GKMatchmaker share