- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在这里耐心等待,因为有很多东西要解释!
我正在努力在我的游戏中实现一个 Game Center 高分排行榜。我已经环顾四周寻找如何正确实现此代码的示例,但找不到很多 Material 。因此,我尝试根据我在苹果文档中找到的信息自己实现它。
长话短说,当我更新我的分数时,我得到了成功打印,但实际上没有发布任何分数(或者至少在打开时没有分数显示在 Game Center 排行榜上)。
在我展示代码之前,我质疑的一件事是这个游戏仍在开发中。在 AppStoreConnect 中,排行榜的状态为“未上线”。这会影响发布的分数吗?
上代码。我创建了一个 GameCenter 类,用于处理获取排行榜并将分数发布到特定排行榜。我将完整发布代码,并将在下面讨论正在发生的事情。
class Leaderboard
{
var id : String
var leaderboard : GKLeaderboard
var loaded : Bool
init()
{
self.id = ""
self.leaderboard = GKLeaderboard()
self.loaded = false
}
init(id: String, leaderboard: GKLeaderboard, loaded: Bool)
{
self.id = id
self.leaderboard = leaderboard
self.loaded = loaded
}
}
class GameCenter
{
static let shared = GameCenter()
private var player = GKLocalPlayer.local
private var leaderboards : [Leaderboard] = []
func authenticatePlayer()
{
player.authenticateHandler = { (vc, error) -> Void in
if let error = error
{
print(error.localizedDescription)
}
else if let vc = vc
{
if let viewController = UIApplication.shared.windows.first!.rootViewController
{
viewController.present(vc, animated: true)
{
self.loadLeaderboards()
}
}
}
else
{
self.loadLeaderboards()
}
}
}
func loadLeaderboards()
{
var leaderboardIDs : [String] = []
// Gather all of the leaderboard ids that we have
for leaderboard in GameCenterLeaderboards.allCases
{
leaderboardIDs.append(leaderboard.rawValue)
}
// Load the leaderboard for all of these ids and add to a new array
GKLeaderboard.loadLeaderboards(IDs: leaderboardIDs) { (loadedLeaderboards, error) in
if let error = error
{
print(error.localizedDescription)
return
}
if let loadedLeaderboards = loadedLeaderboards
{
print("\n--- Loaded Leaderboards ---")
for loadedBoard in loadedLeaderboards
{
let board = Leaderboard(id: loadedBoard.baseLeaderboardID, leaderboard: loadedBoard, loaded: true)
self.leaderboards.append(board)
print("ID: \(board.id)")
}
print("\n")
self.updateLocalHighScore()
}
}
}
func playerAuthenticated() -> Bool
{
return player.isAuthenticated
}
func submitScore(id: String)
{
if ( playerAuthenticated() )
{
let leaderboard = getLeaderboard(id: id)
if ( leaderboard.loaded )
{
print("Submitting score of \(AppSettings.shared.highScore!) for leaderboard \(leaderboard.id)")
leaderboard.leaderboard.submitScore(AppSettings.shared.highScore, context: -1, player: player) { (error) in
if let error = error
{
print(error.localizedDescription)
}
else
{
print("Successfully submitted score to leaderboard")
}
}
}
}
}
func getLeaderboard(id: String) -> Leaderboard
{
if let leaderboard = leaderboards.first(where: { $0.id == id } )
{
return leaderboard
}
return Leaderboard()
}
func updateLocalHighScore()
{
let leaderboard = getLeaderboard(id: GameCenterLeaderboards.HighScore.rawValue)
if ( leaderboard.loaded )
{
leaderboard.leaderboard.loadEntries(for: [player], timeScope: .allTime) { (playerEntry, otherEntries, error) in
if let error = error
{
print(error.localizedDescription)
return
}
if let score = playerEntry?.score
{
print("Player Score in leaderboard: \(score)")
if( score > AppSettings.shared.highScore )
{
AppSettings.shared.highScore = score
print("High Score Updated!")
}
else
{
// Lets post the local high score to game center
self.submitScore(id: leaderboard.id)
print("Local High Score Is Greating, requesting a submit!")
}
}
}
}
}
}
在另一个 GameScene 中,一旦游戏结束,我请求使用以下代码行向 Game Center 发布新的高分:
GameCenter.shared.submitScore(id: GameCenterLeaderboards.HighScore.rawValue)
我最后有疑问的是提交分数时的上下文。根据文档,这似乎只是 GameCenter 不关心的元数据,而是开发人员可以使用的东西。因此,我认为我可以将其划为导致问题的原因。
最佳答案
我遇到了同样的问题 - 使用 iOS 14 提供的新 GameKit API 向 Game Center 提交分数实际上从未保存在 Game Center 端(即使没有报告任何错误)。
最后对我有用的解决方案只是使用 Type Method (使用我的排行榜ID):
class func submitScore(_ score: Int,
context: Int,
player: GKPlayer,
leaderboardIDs: [String],
completionHandler: @escaping (Error?) -> Void)
而不是
Instance Method对应物(显然在 Apple 方面有一些错误):
func submitScore(_ score: Int,
context: Int,
player: GKPlayer,
completionHandler: @escaping (Error?) -> Void)
我为此发疯了,所以我希望这对其他人有所帮助。
关于swift - GameCenter 分数未发布到排行榜,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65153511/
这是关于 GameCenter 的。 因为“GKLocalPlayerListener 协议(protocol)继承了GKChallengeListener、GKInviteEventListener
我一直从 GA 和用户那里收到这个崩溃报告......但是我无法通过使用 ios7 和 ios8 测试 iphone5、5s、6 来重现这个异常。当应用程序进入后台时,此问题无处可去。奇怪的是,gam
在这里耐心等待,因为有很多东西要解释! 我正在努力在我的游戏中实现一个 Game Center 高分排行榜。我已经环顾四周寻找如何正确实现此代码的示例,但找不到很多 Material 。因此,我尝试根
加载 GameCenter 后,它处于默认的纵向 View 。 是否有办法像《水果忍者》那样加载并锁定在横向 View 中? 谢谢.. 我正在将它与 cocos2d 一起使用.. 最佳答案 您是否使用
在我看来,Apple 似乎有点急于实现 GameCenter。也许我忽略了一些事情。 如果您创建一款想要提供应用内购买功能的游戏(假设您想要出售额外的 map 或附加组件),是否有任何方法可以使用 G
我调用了下面的代码来添加在屏幕顶部弹出的 Game center 用户横幅,但它说 Game 无法被 Game Center 识别: 我将其添加到我的 addDidFinishLaunching 中:
我可以通过邮件向排行榜上的顶级玩家发送消息吗?有没有办法获取他们的电子邮件列表? 最佳答案 我非常确定 Apple 绝不会向用户(或开发者)提供其他用户的个人信息,例如他们的电子邮件地址。这将导致各种
我的应用使用 Game Center。我尝试在 VC 加载时记录用户。如果他之前已经登录过,那就太好了,它会在他登录时将通知显示在顶部。如果他没有登录 - 很好,它会显示游戏中心登录 VC。 但是,当
在包含几十个级别(超过一百个)的游戏中,我希望显示/存储每个级别的最高分数。 我在 API documentation 中看到最多可以创建 25 个排行榜类别...... 有什么办法可以实现这种逐级高
我无法显示我的排行榜集。不确定是否可行,但到目前为止我无法让它工作。 在某些背景下,我的游戏中有多个关卡,在每个关卡中我有 3 个评分指标,因此我为每个关卡设置了一个排行榜。 例如: Level 1
我在使用 GameKit 时遇到了一个奇怪的问题。我想知道其他人是否遇到同样的问题。是错误吗? 我已经使用游戏套件实现了一个基本的回合制游戏。一个玩家邀请另一个玩家 + (void)findMatch
func authenticateLocalPlayer(player: GKLocalPlayer) { player.authenticateHandler =
我对 GameCenter 的回合制功能有疑问。该应用程序的免费版本将允许用户一次最多创建 3 场比赛,并将阻止任何创建自动比赛或邀请其他玩家的尝试。我的问题如下,如果一个没有创建比赛限制的玩家邀请另
我有一个 iPhone 游戏,我刚刚添加了 GameCenter 支持,一切似乎都运行正常。但是,作为一个不使用 GameCenter 的人,我添加了一个选项,以便用户可以将其关闭。唯一的问题是,一旦
所以我想在我的游戏中加入 GameCenter 成就,但我必须为每个成就提供图像以在 GameCenter 应用程序中显示。 Apple 并不清楚所需的尺寸。我在网上看到他们需要 512 像素的图像,
我在沙盒模式下为我的游戏创建了一个排行榜。然后我尝试使用不同的 gamecenter 帐户玩游戏。但我只能看到当前登录帐户的分数。这是对的吗?或者我错过了什么?如何用一堆记录填充沙盒排行榜来测试我的游
我正在使用以下函数将分数提交到游戏中心。如何修改下面的代码,以便只有当分数高于已提交的分数时我才能发送分数?而且我不想在本地维护分数。有帮助吗? - (void) reportScore: (int6
一旦用户登录到游戏中心,我希望我的 iphone 应用程序预先填充一些字段。具体来说,用户名! 我有完整的登录工作 - 以及排行榜和成就都在工作 - 我似乎无法找到如何在任何地方访问用户名属性。 任何
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
当前是否有办法从网络读取 GameCenter 排行榜数据? 我正在寻找一种只读方式来在配套网站上显示排行榜。我不需要发布分数或以其他方式操作设备上的排行榜。 我感觉答案是否定的,我需要使用 Open
我是一名优秀的程序员,十分优秀!