在 Google Play 游戏服务中跟踪输赢

Posted

技术标签:

【中文标题】在 Google Play 游戏服务中跟踪输赢【英文标题】:Tracking Wins and Loses in Google Play Game Services 【发布时间】:2014-07-14 14:20:44 【问题描述】:

我正在实施Turn Base Multiplayer game using Google Play Services。不过,它似乎缺少一个主要功能:跟踪输赢!对于任何类型的竞技游戏来说,这似乎都是一个非常重要的功能。

我错过了什么吗?这是否已经由 Google 以某种方式处理?

如果没有,我想知道是否有人实施了自己的 w/l 跟踪系统,以及他们是如何实现的。我担心只是将其保存在本地,因为它可能与现实不同步。我想我可以使用谷歌云存储,但我也担心跟踪哪些比赛已经计入可能有点容易出错(例如,在同一场比赛中多次计算输赢)。也许使用 Google Play 排行榜系统会很好,因为您可以与朋友/等进行比较。

【问题讨论】:

【参考方案1】:

您可能想尝试使用 Google Play 游戏服务提供的 Events。以下是使用它的步骤:

    转到 android 开发者控制台 在侧边栏点击游戏服务,选择您的应用,然后选择事件 然后创建两个新事件,一个名为“Games Won”,另一个名为“Games Lost”,然后点击发布您的更改 单击 Get Resources 链接查看新事件的资源 ID,并将它们添加到应用程序的 res/values 目录中

    当游戏获胜或失败时,调用以下代码,其中 eventRef 是您在上一步添加的友好资源名称,“events_games_won”或“events_games_lost”:

    int eventInt = activity.getApplicationContext().getResources().getIdentifier(eventRef, "string", "com.yourpackage.android"); 
    String eventID = activity.getString(eventInt);
    Games.Events.increment(apiClient, eventID, 1);
    

    如果你使用的是basegameutils,你的apiClient实例可以通过aHelper.getApiClient()获取,否则按照these instructions进行设置。

    要读取您保存的数据,您可以使用如下回调:

    PendingResult<Events.LoadEventsResult> results = Games.Events.load(apiClient, true);
    results.setResultCallback(new ResultCallback<Events.LoadEventsResult>() 
            @Override
            public void onResult(Events.LoadEventsResult result) 
            
                Events.LoadEventsResult r = (Events.LoadEventsResult)result;
                EventBuffer eb = r.getEvents();
                for (int i=0; i < eb.getCount(); i++) 
                    Event event = eb.get(i);
                    // do something, like cache the results for later
                    YourGameState.eventStats.put(event.getName(), (int)event.getValue());
                
                eb.close();
                listener.onResult();
            
        );
    

与在本地维护和管理计数相比,这种方法的好处是:

胜负存储在 Google Play 的云中,并将存储在用户的所有设备上 您可以使用事件来创建任务(在 Google Play 上也有描述),例如“本周赢得 10 场比赛”或“本周不败” Google Play 将为您提供所有玩您游戏的人的事件统计信息,这对于分析玩家活动和表现非常有用

当然,您可以使用相同的方法为您想要的任何内容创建事件。

【讨论】:

这是否意味着玩家需要在游戏结束时在线才能跟踪结果?我的游戏是回合制/异步的,所以当游戏完成时用户可能实际上并不在游戏中。 很有帮助,您的用户不需要在线,正如developer.android.com/reference/com/google/android/gms/games/…(此处)所解释的那样,事件在本地缓存并分批刷新到服务器。因此,即使他们处于离线状态,下次重新建立与 Google Play 的连接时,事件也会更新。对于您的应用程序,您可以将增加赢/输事件的代码放在通知玩家游戏结果的位置。 抱歉,我不清楚他们在线是什么意思。我的意思是用户不会收到有关比赛结果的信息,除非他们打开该比赛(从谷歌服务器请求更新的游戏状态)。如果用户永远不会返回到比赛中查看结果(例如,他们认为他们不可能获胜),他们将永远不会收到更新说他们输了,并且事件永远不会被记录。最常见的技巧是在你输掉比赛之前离开比赛,并且永远不会回来,以保持完美的获胜百分比。 您可以在玩家启动应用时检查优秀游戏。如果他们永远不会回来,这只是一个问题。但是,如果对您而言重要的是在知道结果后立即自动更新游戏统计数据,那么我建议您使用基于 REST 的键值存储(如 parse.com)或 Google 自己的云存储。【参考方案2】:

这取决于您的实施。我创建了一个国际象棋应用程序,我只使用SharedPreferences 来跟踪我的输赢。如果使用得当,就不会出错。

例如。

SharedPreferences prefs = this.getSharedPreferences(
      "com.example.app", Context.MODE_PRIVATE);
if (gameOver(Side.White)) 
    prefs.edit().putLong(dateTimeKey, prefs.getLong(losses, 0) + 1).commit();
 else if (gameOver(Side.Black))
    prefs.edit().putLong(dateTimeKey, prefs.getLong(wins, 0) + 1).commit();

【讨论】:

我也是,它远非完美,在我的情况下需要大量的字符串处理,而且很容易被篡改。 Google 确实应该满足这一需求。

以上是关于在 Google Play 游戏服务中跟踪输赢的主要内容,如果未能解决你的问题,请参考以下文章

是否可以使用 Google Play 排行榜和成就来跟踪消耗性 IAP-s?

了解 google play 给出的 ANR 堆栈跟踪

Google Play 游戏服务 - 无法登录游戏中心

在安卓游戏中配置不当的 Google play 游戏服务

Android Google Play 游戏服务回合制多人游戏不自动匹配

在 Flutter 中使用 Google Play 游戏服务?