除非轮到玩家,否则 TBMP 不会获得游戏更新
Posted
技术标签:
【中文标题】除非轮到玩家,否则 TBMP 不会获得游戏更新【英文标题】:TBMP not getting game updates unless it is player's turn 【发布时间】: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。 【参考方案1】:一种解决方法是将所有转弯存储在消息数据中。这样,我可以将游戏数据视为消息队列并重播所有内容直到当前回合。这并不理想,但确实有效。
【讨论】:
以上是关于除非轮到玩家,否则 TBMP 不会获得游戏更新的主要内容,如果未能解决你的问题,请参考以下文章