TBMP没有得到游戏更新,除非是玩家轮到

时间:2018-06-12 06:11:46

标签: android google-play-games multiplayer

我正在尝试将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获得更新。他得到通知,该比赛有更新,但无法知道当前游戏数据是什么样的。

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

1 个答案:

答案 0 :(得分:0)

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