Конфигурация комнаты не работает должным образом в многопользовательских сервисах Google для Android
Я пытаюсь создать многопользовательскую игру в реальном времени, и сейчас я изучаю образец игры, предоставленной Google для многопользовательской игры. Ссылка есть...
https://github.com/playgameservices/android-samples/tree/master/ButtonClicker
проблема в том, что когда я изменяю конфигурацию критериев автоматического соответствия в соответствии с моим требованием
void startQuickGame() {
final int MIN_OPPONENTS = 1, MAX_OPPONENTS = 3;
Bundle autoMatchCriteria = RoomConfig.createAutoMatchCriteria(MIN_OPPONENTS,
MAX_OPPONENTS, 0);
RoomConfig.Builder rtmConfigBuilder = RoomConfig.builder(this);
rtmConfigBuilder.setMessageReceivedListener(this);
rtmConfigBuilder.setAutoMatchCriteria(autoMatchCriteria);
rtmConfigBuilder.setRoomStatusUpdateListener(this);
getGamesClient().createRoom(rtmConfigBuilder.build());
}
тогда этот код не ждет 3-го или 4-го игрока в комнате (как я установил в MAX_OPPONENTS), и игра начинается сразу с 2 игроками (1 противник). Я хочу добавить здесь таймер, и игра начинается после указанного времени.
и что удивительно, после создания комнаты значение MIN_PLAYER не работает вообще в этом коде, который используется для пользовательского интерфейса комнаты по умолчанию.
final int MIN_PLAYERS = 2;
Intent i = getGamesClient().getRealTimeWaitingRoomIntent(room, MIN_PLAYERS);
// show waiting room UI
startActivityForResult(i, RC_WAITING_ROOM);
Мое требование заключается в том, что после создания комнаты я хочу подождать определенное время, а затем игра начинается с присоединенного игрока. независимо от того, являются ли они 2, 3 или 4.
2 ответа
Алгоритм автоматического сопоставления не очень старается максимизировать количество игроков в матче - если вы установите min на 1 и max на 3, возможно получить игру для 2 игроков.
В этом случае вы должны установить для MIN_OPPONENTS и MAX_OPPONENTS значение 3 и обработать логику запуска игры из своего кода.
Если вы хотите реализовать эту логику таймера, вы не можете использовать наш встроенный интерфейс зала ожидания, потому что он не поддерживает запуск игры рано, основываясь на времени. Поэтому вместо этого реализуйте свою собственную комнату ожидания с помощью этой логики:
Запустите свой таймер.
Отображение прогресса на экране, когда вы видите, что одноранговые узлы подключаются или отключаются через onPeerConnected() и onPeerDisconnected(), а также другие обратные вызовы. Смотрите RoomStatusListener и RoomStatusUpdateListener.
Когда таймер истекает, решите, что вы собираетесь делать. Например, если подключено более 2 игроков, запустите игру. Если нет, подожди дольше, сдавайся и т. Д.
Разберись со случаем, когда кто-то поздно присоединится к игре. Это произойдет, если 2 игрока присоединились, таймер истек, игра началась, а затем появился 3-й или 4-й игрок. Убедитесь, что опыт для них не страшен (не выгоняйте их):-) Если вы не можете интегрировать их в текущую игру, вы можете оставить их в "режиме зрителя" и присоединиться к следующему раунду / матч / и т.д..
Важно: помните, что таймеры для разных игроков не будут синхронизированы в приведенной выше логике - поэтому вы должны отправить надежное сообщение в режиме реального времени всем пирам, когда вы решите начать игру, чтобы они знали, что игра начинается и что они должны перейти на экран игры.
Если логика усложняется, имеет смысл выбрать "сервер". Вы можете сделать это, например, сказав, что клиент с наименьшим идентификатором участника (лексикографически) является сервером. Сказать "кто бы ни создал игру - это сервер" - нехорошо, потому что при автоматическом сопоставлении все думают, что создали игру.
Я надеюсь, что это помогло!
Просто наткнулся на этот отрывок, который может быть интересен другим по вашей проблеме:
Второй параметр в getRealTimeWaitingRoomIntent() указывает количество игроков, которые должны быть подключены в комнате, прежде чем отобразится опция Начать игру. В примере мы указываем MAX_VALUE, который указывает, что опция Начать воспроизведение никогда не отображается. Вместо этого интерфейс зала ожидания автоматически закрывается, когда все игроки подключены.
Поэтому, если вы не установили MAX_VALUE при использовании намерения встроенной комнаты ожидания, вы можете оставить на усмотрение игрока, если он начнет игру с минимальным количеством игроков, или дождаться присоединения большего количества людей.