3

如标题所示,我已经能够连接到谷歌游戏服务,在两台设备之间交换数据,一切都运行良好,除了一件事:断开回调

我试图拦截 onPeersDisconnected 和 onP2PDisconnected 都没有成功。onP2PDisconnected 方法在与 Internet 断开连接的设备中被调用,但在仍然在线的设备中没有被调用(因此无法告诉玩家另一个已断开连接)。

比赛开始后,似乎永远不会通知第二台设备意外断开连接。如果用户正确关闭游戏,则调用 onPeersLeft 方法。

两个设备之间的 ping 真的有必要克服这个“错误”吗?难道我做错了什么?

这是我使用的代码:

void startQuickGame() {
    // quick-start a game with 1 randomly selected opponent
    final int MIN_OPPONENTS = 1, MAX_OPPONENTS = 1;
    Bundle autoMatchCriteria = RoomConfig.createAutoMatchCriteria(MIN_OPPONENTS,
            MAX_OPPONENTS, 0);
    RoomConfig.Builder rtmConfigBuilder = RoomConfig.builder(this);
    rtmConfigBuilder.setMessageReceivedListener(this);
    rtmConfigBuilder.setRoomStatusUpdateListener(this);
    rtmConfigBuilder.setAutoMatchCriteria(autoMatchCriteria);
    mListener.switchToScreen(R.id.screen_wait);
    keepScreenOn();
    resetGameVars();
    getGamesClient().createRoom(rtmConfigBuilder.build());
}

这里是简单的听众:

@Override
public void onPeersDisconnected(Room room, List<String> peers) {
    Log.d(TAG, "onPeersDisconnected");
    updateRoom(room);
}

void updateRoom(Room room) {
    Log.d(TAG, "UpdateRoom: "+room.getParticipants().size());
    mParticipants = room.getParticipants();
}

@Override
public void onP2PDisconnected(String participantId) {
    Log.d(TAG,  "onP2PDisconnected");

}

public int getPartecipantsInRooom(){
    if(mRoom != null)
        return mRoom.getParticipants().size();
    else
        return -123456;
}

请注意,在两个设备之一断开连接后调用 getPartecipantsInRooom() 始终返回 2,并且永远不会调用 updateRoom。

4

3 回答 3

1

只是为了确保这可能对您不起作用,对于我的应用程序,我使用它来让我知道另一个参与者何时离开房间,并立即调用它:

@Override
    public void onPeerLeft(Room room, final List<String> participantIds) {


        this.mRoomCurrent = room;
        this.mRoomId = this.mRoomCurrent.getRoomId();
        this.mParticipants = this.mRoomCurrent.getParticipants();

        int connected = 0;
        for (Participant p : room.getParticipants()) {
            if(p.getStatus() == Participant.STATUS_JOINED) {
                connected += 1;
            }
        }

        final int fconnected = connected;
        for (String s : listIgnoreTheseIDs) {
            //checkint to see if we care anymore about this ID.. if out of game already.. nope
            if(s.equals(participantIds.get(0))){
                return;
            }
        }
        Gdx.app.postRunnable(new Runnable() {
                @Override
                public void run() {
                    mGHInterface.onPeerLeft(fconnected, participantIds.size()); 
                }
            });
        }

不知道为什么有两个项目,但像你一样,我意识到 onPeersDisconnected() 并不那么可靠,但 onPeerLeft() 通常会在 1 秒内返回到其他设备。

于 2013-09-11T13:50:37.637 回答
1

onPeerDisconnected() 处理断开连接。因此,如果有人仍在应用程序中但网络连接丢失,则为他调用。

onPeerLeft() 处理离开房间的参与者。当有人 explizit 离开应用程序中的房间或应用程序被最小化,并且房间留在 androids 的 onStop() 或 onDestroy() 回调时,会调用此方法。

于 2014-06-09T10:06:22.187 回答
0

我正在制作两人游戏。所以我使用这种方法

@Override
public void onPeerLeft(Room room, List<String> peersWhoLeft) {
    updateRoom(room);
    Toast.makeText(MyLauncherActivity.this, "Other player left the game", Toast.LENGTH_LONG).show();
    quitGame();
}
于 2013-09-11T13:54:52.607 回答