Я использую многопользовательскую поддержку в реальном времени игровых сервисов Google Play в одном из моих игровых приложений.Конфигурация автоматического соответствия задается следующим образом:
Bundle autoMatchCriteria = RoomConfig.createAutoMatchCriteria(7, 7, 0);
Поэтому будет создана игра с 6 игроками.У меня сейчас следующая проблема:
Допустим, к залу ожидания подключено уже 4 человека, тогда они не увидят друг друга.Поэтому они не знают, что другие люди уже связаны.Имена игрока будут раскрыты, только если все 7 участников подключены.Такое поведение не побуждает людей оставаться в комнате ожидания до тех пор, пока все игроки не будут подключены, потому что для них это выглядит так, будто они одни ждут.
На рисунке ниже показана комната ожидания.Два человека уже были связаны, но игрок может видеть только себя.Строки 'auto-pick' будут заменены именами игроков, когда комната заполнена, что слишком поздно.
Как я могу показать реальныйсостояние зала ожидания для игроков?Я не хочу мотивировать их оставаться в комнате ожидания.
Зависимости 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();
Любые подсказки или обходные пути приветствуются.