Example #1
0
        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);
        }
Example #2
0
        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;
        }
Example #3
0
 private EventHandler <RoutedEventArgs> CreateTitleMenuScreenTransitionClickHandler(TitleScreenStartGameMode startGameMode)
 {
     return((sender, e) =>
     {
         if (_ignoreInputEvents || !IsTopMostScreen)
         {
             return;
         }
         NavigateScreenForward(startGameMode);
     });
 }