代码之家  ›  专栏  ›  技术社区  ›  Kyri33

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

  •  2
  • Kyri33  · 技术社区  · 10 年前

    我正在尝试使用Play games服务在android中开发一个简单的基于回合的多人游戏。我遵循了文档中的所有步骤: https://developers.google.com/games/services/android/turnbasedMultiplayer#implementing_auto-matching 唯一的区别是,我不希望我的球员能够邀请朋友,我希望这纯粹是自动匹配。该游戏只有2名玩家,只有在2名玩家匹配后才能开始。我的问题是它似乎不是自动球员。我在两台设备上运行应用程序,但他们似乎从未找到彼此。。。他们都很好地连接到Play Games Services,但他们都只是创建了一个新游戏。这是我连接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 回复  |  直到 10 年前
        1
  •  1
  •   tron    10 年前

    尝试更改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”和“Not automaticing”(!)。更改为空后,第一个设备显示“Player1”和“仍然自动”,第二个设备显示为“Player2”[B@41b08830"

    我认为你的问题是由于Play Game服务处理邀请和自动匹配的方式。当将参与者连接到TurnBasedMultiplayer比赛时,邀请会逐一发送给参与者。在initGame方法中调用takeTurn时,必须指定下一个要接收邀请的参与者。当该参与者接受邀请后,他必须调用takeTurn并指定下一个要接收邀请的参与者,依此类推。如果指定为空,则表示下一个邀请将发送给自动玩家。