Зал ожидания в Play Games Multiplayer не показывает подключенных игроков - PullRequest
0 голосов
/ 26 января 2019

Я использую многопользовательскую поддержку в реальном времени игровых сервисов Google Play в одном из моих игровых приложений.Конфигурация автоматического соответствия задается следующим образом:

Bundle autoMatchCriteria = RoomConfig.createAutoMatchCriteria(7, 7, 0);

Поэтому будет создана игра с 6 игроками.У меня сейчас следующая проблема:

Допустим, к залу ожидания подключено уже 4 человека, тогда они не увидят друг друга.Поэтому они не знают, что другие люди уже связаны.Имена игрока будут раскрыты, только если все 7 участников подключены.Такое поведение не побуждает людей оставаться в комнате ожидания до тех пор, пока все игроки не будут подключены, потому что для них это выглядит так, будто они одни ждут.

На рисунке ниже показана комната ожидания.Два человека уже были связаны, но игрок может видеть только себя.Строки 'auto-pick' будут заменены именами игроков, когда комната заполнена, что слишком поздно.

Waiting room

Как я могу показать реальныйсостояние зала ожидания для игроков?Я не хочу мотивировать их оставаться в комнате ожидания.

Зависимости Gradle:

dependencies {
implementation 'com.android.support:multidex:1.0.3'
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support:mediarouter-v7:28.0.0'
implementation 'com.android.support:animated-vector-drawable:28.0.0'
implementation 'com.android.support:customtabs:28.0.0'
implementation 'com.android.billingclient:billing:1.2'
implementation 'com.android.support:support-v4:28.0.0'
implementation 'com.google.code.gson:gson:2.8.2'
implementation 'com.google.android.gms:play-services-appstate:6.5.87'
implementation 'com.google.android.gms:play-services-games:16.0.0'
implementation 'com.google.firebase:firebase-core:16.0.6'
implementation 'com.google.android.gms:play-services-auth:16.0.1'
implementation 'com.google.android.gms:play-services-ads:16.0.0'

Вот как создается игра:

   void startQuickGame() {
    final int MAX_OPPONENTS = 6;
    int min_opponents = 6;
    Bundle autoMatchCriteria = RoomConfig.createAutoMatchCriteria(min_opponents,
            MAX_OPPONENTS, 0);
    RoomConfig.Builder rtmConfigBuilder = RoomConfig.builder(this);
    rtmConfigBuilder.setMessageReceivedListener(this);
    rtmConfigBuilder.setRoomStatusUpdateListener(this);
    rtmConfigBuilder.setAutoMatchCriteria(autoMatchCriteria);
    rtmConfigBuilder.setVariant(variant);
    switchToScreen(R.id.mpGamescreen_wait);
    keepScreenOn();

    Games.RealTimeMultiplayer.create(mGoogleApiClient, rtmConfigBuilder.build());
    }

Вышеметод startQuickGame(); был вызван внутри onConnected(Bundle connectionHint) метода.OnActivityResult выглядит следующим образом:

    @Override
public void onActivityResult(int requestCode, int responseCode, Intent intent) {
    super.onActivityResult(requestCode, responseCode, intent);

    switch (requestCode) {
        case RC_SELECT_PLAYERS:
            // we got the result from the "select players" UI -- ready to create the room
            handleSelectPlayersResult(responseCode, intent);
            break;
        case RC_WAITING_ROOM:
            // we got the result from the "waiting room" UI.
            if (responseCode == Activity.RESULT_OK) {
                // ready to start playing
                Log.d(TAG, "debug Starting game (waiting room returned OK).");
                //startGameHandler(true);
            } else if (responseCode == GamesActivityResultCodes.RESULT_LEFT_ROOM) {
                // player indicated that they want to leave the room
                leaveRoom();
            } else if (responseCode == Activity.RESULT_CANCELED) {
                // Dialog was cancelled (user pressed back key, for instance). In our game,
                // this means leaving the room too. In more elaborate games, this could mean
                // something else (like minimizing the waiting room UI).
                leaveRoom();
            }
            break;
        case RC_SIGN_IN:
            Log.d(TAG, "debug onActivityResult with requestCode == RC_SIGN_IN, responseCode="
                + responseCode + ", intent=" + intent);
            mSignInClicked = false;
            mResolvingConnectionFailure = false;
            if (responseCode == RESULT_OK) {
              mGoogleApiClient.connect();
            } else {
              BaseGameUtils.showActivityResultError(this,requestCode,responseCode, R.string.signin_other_error);
            }
            break;
    }
    super.onActivityResult(requestCode, responseCode, intent);
}

Клиент API был создан следующим образом в oncreate.Обратите внимание, что некоторые методы устарели (следует переключиться на GoogleSignIn в будущем).

        // Create the Google Api Client with access to Plus and Games
    mGoogleApiClient = new GoogleApiClient.Builder(this)
        .addConnectionCallbacks(this)
        .addOnConnectionFailedListener(this)
        //.addApi(Plus.API).addScope(Plus.SCOPE_PLUS_LOGIN)
        .addApi(Games.API).addScope(Games.SCOPE_GAMES)
        .build();

Любые подсказки или обходные пути приветствуются.

1 Ответ

0 голосов
/ 26 января 2019

Как насчет вашего слушателя RoomStatusUpdate? RoomStatusUpdateCallback Реализуете ли вы метод onPeerJoined (комната комнаты, список участников)?

...