我创建了一个房间,它成功完成了。我的onRoomCreated
方法被调用......
@Override
public void onRoomCreated(int statusCode, Room room) {
mRoomId = room.getRoomId();
Intent i = Games.RealTimeMultiplayer.getWaitingRoomIntent(gApiClient, room, 2);
startActivityForResult(i, RC_WAITING_ROOM);
}
然后在我的onActivityResult
...
Room r = data.getExtras().getParcelable(Multiplayer.EXTRA_ROOM);
ArrayList<String> invitees = new ArrayList<String>();
for (Participant p : r.getParticipants()) {
invitees.add(p.getPlayer().getPlayerId()); //<---NULL POINTER!
}
我得到那个空指针。为什么呢?
编辑:Android文档说这是关于getPlayer()
方法......
返回此参与者所代表的玩家。 请注意,如果玩家的身份未知,则可能为null。这种情况发生在自动匹配的情况下,某些玩家不允许看到其他玩家的真实身份。
这就是为什么我得到null,因为我的房间是通过自动匹配。
现在的问题是。 如何仅使用参与者ID创建turnbasedgame?不是玩家ID
答案 0 :(得分:0)
现在我看到你要求的更清楚了(我的错,不是你的),我就是这样做的:
(为了澄清我使用LibGDX,所以可能是你不需要的一些界面东西,我仍然使用GamesClient而不是新的API方法,但是对于所有意图都相同)
首先,我希望开始我的游戏的最终通话是onRoomConnected
@Override
public void onRoomConnected(int statusCode, Room room) {
//dLog("onRoomConnected");
mRoomCurrent = room;
mParticipants = room.getParticipants();
mMyID = room.getParticipantId(aHelper.getGamesClient().getCurrentPlayerId());
//dLog("The id is " + mMyID);
try {
bWaitRoomDismissedFromCode = true;
finishActivity(RC_WAITING_ROOM);
} catch (Exception e) {
//dLog("would have errored out in waiting room");
}
//tell the Game the room is connected
if (statusCode == GamesClient.STATUS_OK) {
theGameInterface.onRoomConnected(room.getParticipantIds(), mMyID, room.getCreationTimestamp() );
} else {
leaveRoom();
}
}
所以,现在让所有参与者ID ...现在在我的游戏代码中(我发送了ID列表),我对ID列表进行排序,以便在确定玩家订单时,它对所有玩家来说都是相同的方法。首先,我建立了对手。
private void buildOpponents() {
// this creates a new opponent with a View on the Stage()
//sort the participants the same for all players
sortParticipantIDs();
for (String s : mParticipantIds) {
if(s.contains(mMyID) || mMyID.contains(s)) continue;
newOpponentWindow ow = new newOpponentWindow(s, MyAssetManager.getMySkin(), getStage());
Opponent o = new Opponent(this, s);
mapOpponents.put(s, o);
o.setWindow(ow);
getStage().addActor(ow);
}
setOpponentWindowPositions();
}
然后经过一些更多的设置后,我开始播放和我的第一次Time through,我选择了那个顶级ID的人获得了开始的荣誉(我发现这个随机播放足够,而不必另外做一个方法..但是你可以让顶级ID执行另一种方法,并将其发送给其他玩家)注意,如果有人在游戏后期离开房间,请检查我的对手以确定起始玩家。
private boolean determineIfStartingBidder() {
Collections.sort(mParticipantIds);
// now look thru list
// if the number is mine then return true
// if the number is not mine.. and opponent is not Out of Game or Disconnected.. then return false
for (String s : mParticipantIds) {
if(s.contains(mMyID) || mMyID.contains(s)){
return true;
}
if(mapOpponents.get(s).getCurrentState() == currentState.DISCONNECTED || mapOpponents.get(s).getCurrentState() == currentState.OUTOFGAME ||
mapOpponents.get(s).getCurrentState() == currentState.LOSTGAME) {
continue;
}
return false;
}
return false;
}
然后在您的游戏逻辑中,只需以任何有意义的方式通过您的ParticipantID列表来传递接力棒!这很有效,因为传递消息的所有调用都需要ParticipantID,并且可以轻松抓取!
以前的答案-------------------------------------------- ----
试
data.getParcelableExtra(Multiplayer.EXTRA_ROOM);
不需要getExtras