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

Posted

技术标签:

【中文标题】Android Google Play 游戏服务回合制多人游戏不自动匹配【英文标题】:Android Google Play Games Services Turn based Multiplayer not Automatching 【发布时间】:2015-05-22 13:43:35 【问题描述】:

我正在尝试使用 Play 游戏服务在 android 中开发一个简单的回合制多人游戏。我遵循了文档中的所有步骤:https://developers.google.com/games/services/android/turnbasedMultiplayer#implementing_auto-matching 唯一的区别是我不希望我的玩家能够邀请朋友我希望它是纯粹的自动匹配。游戏只有 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:“仍在自动化” 我究竟做错了什么。为什么设备不自动匹配。我是否在某处跳过了一步。请帮忙。

【问题讨论】:

【参考方案1】:

尝试更改您的 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 游戏服务回合制多人游戏不自动匹配的主要内容,如果未能解决你的问题,请参考以下文章

Google Play 游戏服务 - Android 示例错误

Android 模拟器上的 Google Play 服务和 Google Play 游戏应用

libGDX Google Play 游戏服务 - Android

使用Google Play游戏服务android成功创建房间后强制启动游戏

如何测试使用 google play 游戏服务的未发布的 android 游戏?

Google play 服务游戏静默登录错误 'com.google.android.gms.common.api.ApiException: 4:'