Android Google Play 游戏服务回合制多人游戏而非自动匹配
Android Google Play Games Services Turn based Multiplayer not Automatching
我正在尝试使用 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:"Still automatching"
我究竟做错了什么。为什么设备不自动匹配。我在某处跳过了一步吗?请帮忙。
尝试更改您的 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 automatching"(!)。更改为 null 后,第一个设备表示 "Player1" 和 "Still automatching",第二个设备表示 "Player2 [B@41b08830"
我认为您的问题是由 Play 游戏服务处理邀请和自动匹配的方式造成的。将参与者连接到 TurnBasedMultiplayer 比赛时,邀请将逐一发送给参与者。当您在 initGame 方法中调用 takeTurn 时,您必须指定下一个接收邀请的参与者。当该参与者接受邀请后,他必须调用 takeTurn 并指定下一个参与者接收邀请等。如果您指定 null,则意味着下一个邀请将发送给自动匹配的玩家。
我正在尝试使用 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:"Still automatching" 我究竟做错了什么。为什么设备不自动匹配。我在某处跳过了一步吗?请帮忙。
尝试更改您的 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 automatching"(!)。更改为 null 后,第一个设备表示 "Player1" 和 "Still automatching",第二个设备表示 "Player2 [B@41b08830"
我认为您的问题是由 Play 游戏服务处理邀请和自动匹配的方式造成的。将参与者连接到 TurnBasedMultiplayer 比赛时,邀请将逐一发送给参与者。当您在 initGame 方法中调用 takeTurn 时,您必须指定下一个接收邀请的参与者。当该参与者接受邀请后,他必须调用 takeTurn 并指定下一个参与者接收邀请等。如果您指定 null,则意味着下一个邀请将发送给自动匹配的玩家。