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

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

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

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

【问题讨论】:

    标签: android google-play-services google-play-games


    【解决方案1】:

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

    1. 转到 Android 开发者控制台
    2. 在侧边栏点击游戏服务,选择您的应用,然后选择事件
    3. 然后创建两个新事件,一个名为“Games Won”,另一个名为“Games Lost”,然后点击发布您的更改
    4. 单击 Get Resources 链接查看新事件的资源 ID,并将它们添加到应用程序的 res/values 目录中
    5. 当游戏获胜或失败时,调用以下代码,其中 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进行设置。

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

      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 确实应该满足这一需求。
    猜你喜欢
    • 1970-01-01
    • 2014-02-02
    • 1970-01-01
    • 2013-07-31
    • 2017-09-27
    • 2018-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多