3

タイトルにあるように、Google ゲーム サービスに接続して、2 つのデバイス間でデータを交換できました。すべて正常に動作していますが、1 つのことを除いては、切断コールバックです。

onPeersDisconnected と onP2PDisconnected の両方を傍受しようとしましたが、成功しませんでした。onP2PDisconnected メソッドは、インターネットから切断されたデバイスで呼び出されていますが、まだオンラインであるデバイスでは呼び出されていません (したがって、他のデバイスが切断されたことをプレーヤーに伝える方法はありません)。

試合が開始された後、2 番目のデバイスには偶発的な切断が通知されないようです。ユーザーがゲームを適切に閉じると、onPeersLeft メソッドが呼び出されます。

この「バグ」を克服するために、2 つのデバイス間の 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;
}

2 つのデバイスのいずれかが切断された後に getPartecipantsInRooom() を呼び出すと、常に 2 が返され、updateRoom が呼び出されることはないことに注意してください。

4

3 に答える 3

1

onPeerDisconnected() は切断を処理します。そのため、誰かがまだアプリケーションを使用しているが、ネットワーク接続が失われた場合、これが呼び出されます。

onPeerLeft() は、ルームを退出する参加者を処理します。これは、explizit がアプリケーションのルームを離れたとき、またはアプリケーションが最小化されたときに呼び出され、Android の onStop() または onDestroy() コールバックでルームが残されます。

于 2014-06-09T10:06:22.187 に答える
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()); 
                }
            });
        }

2 つの項目がある理由はわかりませんが、あなたと同じように、onPeersDisconnected() はそれほど信頼できないことに気付きましたが、onPeerLeft() は通常 1 秒以内に他のデバイスに戻ります。

于 2013-09-11T13:50:37.637 に答える
0

2人用ゲームを作っています。だから私はこのアプローチを使用します

@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 に答える