private async void NavigateScreenForward(TitleScreenStartGameMode startGameMode) { _ignoreInputEvents = true; //var uiSoundMgr = GameManagerEntity.Get<UISoundManager>(); //uiSoundMgr?.PlaySound(uiSoundMgr.ButtonMainConfirmSoundEffect); var uiPageEntity = await UIManager.LoadUIEntityAsync(UIManager.ServerConnectionScreenUIUrl); var pageHandler = uiPageEntity.GetPageHandlerFromUIPageEntity <ServerConnectionScreenPageHandler>(); pageHandler.StartGameMode = startGameMode; pageHandler.PlayerName = _playerNameText.Text; if (startGameMode == TitleScreenStartGameMode.HostMultiplayerGame || startGameMode == TitleScreenStartGameMode.JoinMultiplayerGame) { // TODO: should really do proper validation pageHandler.ServerIp = _serverIpText.Text; ushort.TryParse(_serverPortNumberText.Text, out pageHandler.ServerPortNumber); } else { pageHandler.ServerIp = null; pageHandler.ServerPortNumber = default; } UIManager.PushScreen(uiPageEntity); }
public async Task BeginGameConnection(TitleScreenStartGameMode startGameMode, string playerName, string serverIp, ushort serverPortNumber) { Debug.Assert(startGameMode != TitleScreenStartGameMode.NotSet, $"{nameof(startGameMode)} was not set."); _currentConnectionState = ConnectionState.Connecting; ConnectionStateChanged?.Invoke(_currentConnectionState); Task <Scene> loadSceneTask = null; switch (startGameMode) { case TitleScreenStartGameMode.SinglePlayerGame: { _networkService.StartLocalGame(); _currentConnectionState = ConnectionState.CanEnterGame; // Load the game scene in the background var sceneUrl = SceneManager.InGameSceneUrl; loadSceneTask = SceneManager.LoadSceneAsync(sceneUrl); } break; case TitleScreenStartGameMode.HostMultiplayerGame: { _networkService.StartHost(serverPortNumber); _currentConnectionState = ConnectionState.CanEnterGame; // Load the game scene in the background var sceneUrl = SceneManager.InGameSceneUrl; loadSceneTask = SceneManager.LoadSceneAsync(sceneUrl); } break; case TitleScreenStartGameMode.JoinMultiplayerGame: { Debug.Assert(!string.IsNullOrEmpty(playerName)); Debug.Assert(!string.IsNullOrEmpty(serverIp)); // Connect to server var connectTask = _networkService.BeginConnectToServer(serverIp, serverPortNumber); var connectResult = await connectTask; if (!connectResult.IsOk) { ConnectionError?.Invoke(connectResult.ErrorMessage); return; } var networkClientHandler = connectResult.ClientHandler; // Request to join the game _currentConnectionState = ConnectionState.JoinGameRequest; ConnectionStateChanged?.Invoke(_currentConnectionState); var joinGameTask = networkClientHandler.SendJoinGameRequest(playerName); var joinGameResult = await joinGameTask; if (!joinGameResult.IsOk) { ConnectionError?.Invoke(joinGameResult.ErrorMessage); return; } // Load the game scene in the background var sceneAssetId = joinGameResult.LoadSceneAssetId; var sceneUrl = _networkAssetDatabase.GetUrlReferenceFromAssetId <Scene>(sceneAssetId); loadSceneTask = SceneManager.LoadSceneAsync(sceneUrl); // Synchronize the game clock _currentConnectionState = ConnectionState.SynchronizingClock; ConnectionStateChanged?.Invoke(_currentConnectionState); var syncClockTask = networkClientHandler.SendClockSynchronization(); var syncClockResult = await syncClockTask; if (!syncClockResult.IsOk) { ConnectionError?.Invoke(syncClockResult.ErrorMessage); return; } _currentConnectionState = ConnectionState.CanEnterGame; ConnectionStateChanged?.Invoke(_currentConnectionState); } break; default: Debug.Fail($"Unhandled game mode: {startGameMode}"); break; } var scene = await loadSceneTask; if (loadSceneTask.IsFaulted) { ConnectionError?.Invoke("Level could not be loaded."); return; } var sceneHandler = scene.GetSceneHandlerFromScene <InGameSceneHandler>(); switch (startGameMode) { case TitleScreenStartGameMode.SinglePlayerGame: case TitleScreenStartGameMode.HostMultiplayerGame: { sceneHandler.InitialSettings.AddLocalPlayer = true; sceneHandler.InitialSettings.LocalPlayerName = playerName; } break; default: sceneHandler.InitialSettings = default; break; } // Store it in a field and wait for the next Update call to ensure we don't get into issues like // leaving the screen before the load completed. _inGameScene = scene; }
private EventHandler <RoutedEventArgs> CreateTitleMenuScreenTransitionClickHandler(TitleScreenStartGameMode startGameMode) { return((sender, e) => { if (_ignoreInputEvents || !IsTopMostScreen) { return; } NavigateScreenForward(startGameMode); }); }