Android Google Play 游戏服务回合制多人游戏不自动匹配

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

我正在尝试使用 Play 游戏服务在 Android 中开发一个简单的基于回合制的多人游戏。我遵循了文档中的所有步骤:https://developers.google.com/games/services/android/turnbasedMultiplayer#implementing_auto-matching唯一的区别是我不希望我的玩家能够邀请 friend ,我希望它是纯粹的自动匹配。该游戏只有 2 名玩家,只有 2 名玩家匹配后才能开始。我的问题是它似乎没有自动匹配玩家。我在 2 台设备上运行该应用程序,但它们似乎从未找到彼此……它们都可以很好地连接到 Play 游戏服务,但它们都只是创建了一个新游戏。这是我连接 GoogleApiClient 后的代码。

@Override
public void onConnected(Bundle bundle) {
    pDialog.dismiss();
    Toast.makeText(this, "Connected", Toast.LENGTH_LONG).show();

    showDialog("Matching players");

    Bundle autoMatchCriteria = RoomConfig.createAutoMatchCriteria(1,1,0);
    TurnBasedMatchConfig tbmc=TurnBasedMatchConfig.builder().
setAutoMatchCriteria(autoMatchCriteria).build();

    Games.TurnBasedMultiplayer.createMatch(mGoogleApiClient, 
tbmc).setResultCallback(new MatchInitiatedCallback(this));
}

这是我的 MatchInitiatedCallback

public class MatchInitiatedCallback implements    
ResultCallback<TurnBasedMultiplayer.InitiateMatchResult> {

    private Context context;

    public MatchInitiatedCallback(Context c) {
        context = c;
    }

    @Override
    public void onResult(TurnBasedMultiplayer.InitiateMatchResult 
initiateMatchResult) {

        pDialog.dismiss();

        if(!initiateMatchResult.getStatus().isSuccess()) {

            Toast.makeText(context, "ERROR: " + 
initiateMatchResult.getStatus().getStatusCode(), Toast.LENGTH_LONG).show();

            return;
        }

        TurnBasedMatch match = initiateMatchResult.getMatch();

        if(match.getData() != null) {
            Toast.makeText(context, "Player2 " + match.getData().toString(), 
Toast.LENGTH_LONG).show();

        } else {
            Toast.makeText(context, "Player1", Toast.LENGTH_LONG).show();
            initGame(match);
        }
    }
}

两台设备都显示 TOAST:“Player1”并调用此处的 initGame(match) 方法:

public void initGame(TurnBasedMatch match) {
    String initialise = "initialised";
    Games.TurnBasedMultiplayer.takeTurn(mGoogleApiClient,   
match.getMatchId(),initialise.getBytes(Charset.forName("UTF-16")),
match.getParticipantId(Games.Players.getCurrentPlayerId(mGoogleApiClient))).
setResultCallback(this);
}

@Override
public void onResult(TurnBasedMultiplayer.UpdateMatchResult 
updateMatchResult) {

    if(updateMatchResult.getMatch().getStatus() == 
TurnBasedMatch.MATCH_STATUS_AUTO_MATCHING) {
        Toast.makeText(this, "Still automatching",    
Toast.LENGTH_LONG).show();
    } else {
        Toast.makeText(this, "Not automatching", Toast.LENGTH_LONG).show();
    }

}

他们再次显示 TOAST:“仍在自动匹配” 我究竟做错了什么。为什么设备不自动匹配。我在某处跳过了一步吗?请帮忙。

最佳答案

尝试更改您的 initGame 方法,以便它为下一个参与者指定 null(让 Play Game 服务找到一个玩家进行自动匹配):

public void initGame(TurnBasedMatch match) {
    String initialise = "initialised";
    Games.TurnBasedMultiplayer.takeTurn(
        mGoogleApiClient,   
        match.getMatchId(),
        initialise.getBytes(Charset.forName("UTF-16")),
        null
        ).setResultCallback(this);
}

还要确保在两台设备上使用两个不同的 google+ 帐户。

我试过你的代码,两台设备都显示“Player1”和“不自动匹配”(!)。更改为 null 后,第一个设备说“Player1”和“Still automatching”,第二个设备说“Player2 [B@41b08830”

我认为您的问题是由 Play 游戏服务处理邀请和自动匹配的方式造成的。将参与者连接到 TurnBasedMultiplayer 比赛时,邀请将逐一发送给参与者。当您在 initGame 方法中调用 takeTurn 时,您必须指定下一个接收邀请的参与者。当该参与者接受邀请后,他必须调用 takeTurn 并指定下一个参与者接收邀请等。如果您指定 null,则意味着下一个邀请将发送给自动匹配的玩家。

关于Android Google Play 游戏服务回合制多人游戏不自动匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29144668/

相关文章:

android - 操作栏选项卡在屏幕旋转时重叠

java - 如何在 ListView 中添加 ExpandableListView?

android - 如何在模拟器上安装 OpenCV Manager?

android - 设备是否保留超过 1 个版本的 Google Play 服务?

android - 没有互联网的本地网络多人游戏

android - 带有 androidx 命名空间的 Dagger 不起作用

Android Studio AdMob 与 Google Play 服务的集成

java - OnTurnBasedMatchUpdateReceivedListener 不触发

检查两个系统之间的 (USB) 连接中的位错误(对于游戏)

redis - 如何在redis中优化存储字节矩阵以便快速实时访问?