【问题标题】:TBMP not getting game updates unless it is player's turn除非轮到玩家,否则 TBMP 不会获得游戏更新
【发布时间】:2018-11-21 10:41:06
【问题描述】:

我正在尝试将 TBMP 包含在我的麻将游戏中,这个问题已经困扰我几个月了,我离解决它还差得远。

我在一个游戏中有四个玩家,游戏逆时针进行。所以假设你有四个玩家在一张桌子上:

                        Player 3
           ---------------------------
Player 4 |                                |    Player 2
           ---------------------------
                       Player 1

现在轮到玩家 1,数据通过 JSON 推送到游戏数据中,并通知玩家 2 轮到他了。玩家 3 和 4 也收到了比赛更新发生的通知,但是当他们查询游戏数据时,它会返回过时的游戏信息,除非轮到他们,否则他们会获得准确的当前游戏数据。

我希望所有玩家在每一回合后都得到更新,而不是在轮到他们的时候一次性获得所有更新。

我注册一个更新监听器如下:

mTurnBasedMultiplayerClient.registerTurnBasedMatchUpdateCallback(mMatchUpdateCallback);

我有一个按如下方式处理更新的函数:

private TurnBasedMatchUpdateCallback mMatchUpdateCallback = new TurnBasedMatchUpdateCallback() {
  @Override
  public void onTurnBasedMatchReceived(@NonNull TurnBasedMatch turnBasedMatch) {

     int turnStatus = turnBasedMatch.getTurnStatus();

     // OK, it's active. Check on turn status.
     switch (turnStatus) {
        case TurnBasedMatch.MATCH_TURN_STATUS_MY_TURN:

           MainActivity.mTurnData = 
             MahjongTurn.unpersist(turnBasedMatch.getData());
           setLocalGameValues();
           state = GameState.Playing;
           return;

        case TurnBasedMatch.MATCH_TURN_STATUS_THEIR_TURN:

           MainActivity.mTurnData = 
             MahjongTurn.unpersist(turnBasedMatch.getData());
           setLocalGameValues();
           state = GameState.MultiWait;
           return;
     }


  }

  @Override
  public void onTurnBasedMatchRemoved(@NonNull String matchId) {
     game.showToast("A match was removed.");
     state = GameState.MultiWait;
     return;
  }

};

无论如何,监听器已正确注册,我可以看到我的监听器被调用,但对 turnBasedMatch.getData() 的调用仅在轮到玩家时才返回正确的游戏数据。

所以玩家 4 仅在轮到他时才从玩家 1、玩家 2 和玩家 3 获得更新。他会收到比赛有更新的通知,但无法知道当前的比赛数据是什么样的。

这就是它的工作方式吗?我做错了吗?

【问题讨论】:

  • 你查过turn taking GPGS的轮班指南吗,还有github repo的代码参考。
  • 是的,我已经检查了流程和示例。示例完美运行,但它们是一个非常简单的案例。我的游戏要复杂得多。在示例中,它们仅在调用侦听器进行游戏更新时才创建 Toast。我实际上是在尝试更新游戏数据并根据更新显示更新的游戏,但是,游戏数据不会改变以反映更新(在我的情况下)。
  • 调试时,代码有没有进入过 THEIR_TURN 开关?此外,您在两种开关状态下都重复了代码。除了一行(状态变量)之外,每个状态中的所有代码实际上都是相同的。我会将所有代码移到切换发生之前,并将状态作为每个切换案例中的唯一行。
  • 谢谢蒂莫西。是的,我知道代码很草率,但就是这样,因为我正在尝试将部分注释掉,直到它正常工作。就问题而言,是的,我可以验证它确实获得了 THEIR_TURN 和 MY_TURN 的回调,但是游戏数据是陈旧的,直到它是 MY_TURN。

标签: android google-play-games multiplayer


【解决方案1】:

一种解决方法是将所有转弯存储在消息数据中。这样,我可以将游戏数据视为消息队列并重播所有内容直到当前回合。这并不理想,但确实有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-05
    • 2021-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多