我正在尝试将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获得更新。他得到通知,该比赛有更新,但无法知道当前游戏数据是什么样的。
这是它的工作方式吗?我做错了吗?
答案 0 :(得分:0)
一种解决方法是将所有转弯存储在消息数据中。通过这种方式,我可以将游戏数据视为消息队列,并重播当前回合中的所有内容。这并不理想,但它确实有效。