Games.RealtimeMultiplayer.getWaitingRoomIntent空指针异常

时间:2014-02-22 03:15:55

标签: android nullpointerexception google-play-services google-play-games

我创建了一个房间,它成功完成了。我的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

1 个答案:

答案 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