- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
根据Apple docs我们应该做这样的事情来处理 GC 身份验证:
- (void) authenticateLocalUser
{
GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];
if(localPlayer.authenticated == NO)
{
[localPlayer setAuthenticateHandler:(^(UIViewController* viewcontroller, NSError *error) {
if (!error && viewcontroller)
{
DLog(@"Need to log in");
AppDelegate *appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
[appDelegate.window.rootViewController presentViewController:viewcontroller animated:YES completion:nil];
}
else
{
DLog(@"Success");
}
})];
}
}
我们得到了以下信息:
如果设备没有经过身份验证的玩家,Game Kit 会将 View Controller 传递给您的身份验证处理程序。呈现时,此 View Controller 显示身份验证用户界面。你的游戏应该暂停其他需要用户交互的事件(比如你的游戏循环),呈现这个 View Controller 然后返回。当玩家完成与其交互时, View Controller 会自动关闭。
我的问题是,我们如何知道这个 View Controller 何时被关闭,以及我们如何知道身份验证是否成功?
很明显,我需要知道身份验证是否有效,并且我需要知道如果我不得不暂停游戏,何时恢复游戏,因为出现了神奇的 GC View Controller 。
最佳答案
您的代码存在问题:首先,您应该在应用加载后立即设置身份验证处理程序。这意味着无论 localPlayer 是否通过身份验证,您都可以设置处理程序,以便在玩家注销并再次登录时自动调用它。如果您的玩家从您的应用程序切换到游戏中心应用程序,并注销/登录,则不会调用您应用程序中的处理程序(如果他在应用程序首次启动时已经通过身份验证)。设置处理程序的目的在于,每次发生身份验证更改(输入/输出)时,您的应用程序都可以做正确的事情。
其次,你不应该依赖错误来做任何事情。即使返回错误,游戏工具包可能仍具有足够的缓存信息来为您的游戏提供经过身份验证的玩家。这些错误只是为了帮助您进行调试。
要回答您的问题,请先查看下面的代码示例。
-(void)authenticateLocalPlayer
{
GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];
//Block is called each time GameKit automatically authenticates
localPlayer.authenticateHandler = ^(UIViewController *viewController, NSError *error)
{
[self setLastError:error];
if (viewController)
{
self.authenticationViewController = viewController;
[self disableGameCenter];
}
else if (localPlayer.isAuthenticated)
{
[self authenticatedPlayer];
}
else
{
[self disableGameCenter];
}
};
}
-(void)authenticatedPlayer
{
GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];
[[NSNotificationCenter defaultCenter]postNotificationName:AUTHENTICATED_NOTIFICATION object:nil];
NSLog(@"Local player:%@ authenticated into game center",localPlayer.playerID);
}
-(void)disableGameCenter
{
//A notification so that every observer responds appropriately to disable game center features
[[NSNotificationCenter defaultCenter]postNotificationName:UNAUTHENTICATED_NOTIFICATION object:nil];
NSLog(@"Disabled game center");
}
在我的应用程序中,对 authenticateLocalPlayer
的调用仅在应用程序启动时调用一次。这是因为在此之后会自动调用处理程序。
how do we know when this view controller gets dismissed,
你不会知道这个 View Controller 什么时候被关闭。文档中的代码示例说在适当的时候显示 View Controller 。这意味着您不必在游戏中心无法登录时每次 都显示 View Controller 。事实上,您可能不应该立即在处理程序中显示它。您应该仅在您的玩家有必要继续执行手头的任务时才显示 View Controller 。它不应该在奇怪的时间弹出。这就是我保存 View Controller 的原因,以便稍后在需要时显示。
I need to know when to resume the game if I had to pause it because the magic GC view controller was presented.
如果您将身份验证处理程序设置为根据状态更改发布通知,您可以监听事件并显示“暂停菜单”或其他内容,直到用户选择恢复。
how do we know if the authentication succeeded
如果身份验证成功,则 View Controller 为 nil,localPlayer.isAuthenticated
为 true。
or not ?
如果身份验证失败,则 localPlayer.isAuthenticated
为 false,并且 View Controller 为 nil。身份验证失败可能由于多种原因(网络等)而发生,在这种情况下您不应该呈现 View Controller ,这就是 View Controller 将为零的原因。在这种情况下,您应该禁用游戏中心功能直到用户接下来登录。由于身份验证处理程序是自动调用的,因此大多数时候您不需要做任何事情。如果您想提示用户在游戏中心做一些您无法通过代码自动完成的事情,您始终可以提供一种从您的应用程序启动游戏中心应用程序的方法。
编辑:使用像 self.isAuthenticated
这样的标志(正如我上面所做的那样)来跟踪您是否登录不是一个好主意(我不想造成任何困惑,所以我没有删除它)。最好始终检查 [GKLocalPlayer localPlayer].isAuthenticated
编辑:稍微清理了代码 - 删除了不必要的 self.isAuthenticated 和不需要的 block 变量。
关于ios - 处理 Game Center 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20291922/
我正在制作一个简单的游戏,其中敌人在屏幕上四处移动,我们需要射击他们。我想模块化我的代码,所以我想用一个函数替换游戏循环逻辑。但是一旦我这样做,就会有一个下降以 fps 为单位。在while循环中调用
我使用的是标准匹配用户界面和两台 iPad iOS6。问题是当我在第一台设备中创建新的匹配项时,第二台设备应该在我查看匹配用户界面时看到现有的匹配项,但事实并非如此。我确定我的代码是正确的。这是方法:
在 The Practical Guide to Defect Prevention ,作者提到在软件开发中提高生产力的一种创造性方法是实现“生产力游戏”,员工以类似于在 Stack Overflow
我无法让游戏中心与我的应用一起工作。 每当我尝试对用户进行身份验证时,它都会返回以下错误: "The requested operation could not be completed becaus
我是 Game Maker 的新手。我已经创建了一个基于物理的小游戏的机制,并且我使用了 YoYo Games 教程中概述的方法来创建复杂的物理对象 (http://www.yoyogames.com
我正在编写一个 GML 脚本,想知道如何使消息出现在下一行: 例如。 show_message("Hello" + *something* + "World") 输出: Hello World 最佳答
关于这个已经有几个问题,但我按照他们的步骤解决了它,但它似乎对我不起作用。这是我所做的: 1.我仔细检查了 xcode 项目中的包标识符是否与供应门户上的供应配置文件完全相同(它还表示已启用 Game
GameKit 是否允许您以编程方式邀请特定的 Game Center friend 参加比赛,即不提供 GC ViewController?以下 handleInviteFromGameCenter
我正在 Game Maker: Studio 1.4 中构建客户端/服务器应用程序,需要运行游戏的两个实例进行测试。不幸的是,IDE 的运行/调试按钮在启动第一个副本后会自行禁用。有没有办法配置 ID
游戏已启动,我收到了用户的状态,一切就绪。我正在尝试构建一个问答游戏。我正在从远程服务器获取所有信息,其中包括基于问题的图像 Assets 。我可以获取远程数据,但无法显示图像。看来 facebook
我正在努力度过让 Game Center 集成发挥作用的第一阶段。我已经走到这一步了: 我创建了一个干净的新应用,在应用委托(delegate)中添加了 GameKit header 和基本的 aut
DragonRuby Game Toolkit 中好像没有按钮的概念。如何创建按钮等 UI 组件? 最佳答案 按钮(和任何其他 UI 组件)可以解构为 primitives: 按钮有一个点击空间(通常
我正在使用 DragonRuby Game Toolkit 构建游戏。 如何检测一个对象(例如 Sprite)是否与另一个 Sprite 发生碰撞? 这是放置在屏幕上的两个 Sprite 。关于如何检
我已经在我的应用中成功实现了 Game Center 排行榜,并使用 iOS 模拟器进行了测试。将新版本提交到 iTunes Connect 后,沙盒分数会转换到真正的 Game Center 吗?我
我读到 Unity 在渲染清晰文本时出现问题,我尝试了几种不同的修复方法:在导入的字体上设置较大的字体大小,并将字符设置更改为 unicode,使文本大小变大,然后缩放它向下,将过滤模式设置为指向像素
假设角色在游戏中跳跃需要一整秒,如果 FPS 为 10fps、30fps、100fps 等,游戏开发人员如何将跳跃时间保持在 1 秒? - 如果你明白我的意思,你会如何阻止游戏的 fps 基本上影响游
我一直在询问有关我的 Libgdx 游戏 Google Play 游戏服务配置错误的问题。到目前为止,我已经解决了登录错误,但现在我被困在解锁成就上。所以我发布我的代码可能有人可以帮助我。 这是我在
我正在将我的 Android 应用程序更新到最新的 Facebook SDK (4.0.0)。当我创建 GameRequestDialog 时,它向我显示此消息:“游戏请求仅适用于游戏”,而不是向我的
我创建了 GameOver.sks 和 GameOver.swift。如何在默认的 sprite-kit 项目中连接它们,例如 GameSense.sks 和 GameSense.swift? 最佳答
当前收到一个错误,指出无法找到我的 bean 中的 bankOffer 属性。 它来 self 的 game.jsp 文件,如下所示:
我是一名优秀的程序员,十分优秀!