public static void LeaveSessionFromGame(ScreenManager screenManager, AudioManager audioManager)// Audio audioHelper) { // Search through Game.Components to find the NetworkSessionComponent. foreach (IGameComponent component in screenManager.Game.Components) { NetworkSessionComponent self = component as NetworkSessionComponent; if (self != null) { // Display a message box to confirm the user really wants to leave. string message; if (self.networkSession.IsHost) { message = Resources.ConfirmEndSession; } else { message = Resources.ConfirmLeaveSession; } MessageBoxScreen confirmMessageBox = new MessageBoxScreen(message); // Hook the messge box ok event to actually leave the session. confirmMessageBox.Accepted += delegate { self.LeaveSessionFromGame(audioManager);//audioHelper); }; screenManager.AddScreen(confirmMessageBox); break; } } }
/// <summary> /// Event handler for when the Quit Game menu entry is selected. /// </summary> void QuitGameMenuEntrySelected(object sender, EventArgs e) { MessageBoxScreen confirmQuitMessageBox = new MessageBoxScreen(Resources.ConfirmQuitGame); confirmQuitMessageBox.Accepted += ConfirmQuitMessageBoxAccepted; ScreenManager.AddScreen(confirmQuitMessageBox); }
/// <summary> /// When the user cancels the main menu, ask if they want to exit the sample. /// </summary> protected override void OnCancel() { MessageBoxScreen confirmExitMessageBox = new MessageBoxScreen(Resources.ConfirmExitGame); confirmExitMessageBox.Accepted += ConfirmExitMessageBoxAccepted; ScreenManager.AddScreen(confirmExitMessageBox); }
/// <summary> /// Handle MenuSelect inputs by marking ourselves as ready. /// </summary> void HandleMenuSelect(LocalNetworkGamer gamer) { if (!gamer.IsReady) { gamer.IsReady = true; } else if (gamer.IsHost) { // The host has an option to force starting the game, even if not // everyone has marked themselves ready. If they press select twice // in a row, the first time marks the host ready, then the second // time we ask if they want to force start. MessageBoxScreen messageBox = new MessageBoxScreen( Resources.ConfirmForceStartGame); messageBox.Accepted += ConfirmStartGameMessageBoxAccepted; ScreenManager.AddScreen(messageBox); } }
//Audio audioHelper) void LeaveSessionFromGame(AudioManager audioManager) { // Remove the NetworkSessionComponent. Game.Components.Remove(this); // Remove the NetworkSession service. Game.Services.RemoveService(typeof(NetworkSession)); // Dispose the NetworkSession. networkSession.Dispose(); networkSession = null; // If we have a sessionEndMessage string explaining why the session has // ended (maybe this was a network disconnect, or perhaps the host kicked // us out?) create a message box to display this reason to the user. MessageBoxScreen messageBox; if (!string.IsNullOrEmpty(sessionEndMessage)) messageBox = new MessageBoxScreen(sessionEndMessage, false); else messageBox = null; // At this point we normally want to return the user all the way to the // main menu screen. But what if they just joined a session? In that case // they went through this flow of screens: // // - MainMenuScreen // - CreateOrFindSessionsScreen // - JoinSessionScreen (if joining, skipped if creating a new session) // - LobbyScreeen // // If we have these previous screens on the history stack, and the user // backs out of the LobbyScreen, the right thing is just to pop off the // LobbyScreen and JoinSessionScreen, returning them to the // CreateOrFindSessionsScreen (we cannot just back up to the // JoinSessionScreen, because it contains search results that will no // longer be valid). But if the user is in gameplay, or has been in // gameplay and then returned to the lobby, the screen stack will have // been emptied. // // To do the right thing in both cases, we scan through the screen history // stack looking for a CreateOrFindSessionScreen. If we find one, we pop // any subsequent screens so as to return back to it, while if we don't // find it, we just reset everything and go back to the main menu. GameScreen[] screens = screenManager.GetScreens(); // Look for the CreateOrFindSessionsScreen. for (int i = 0; i < screens.Length; i++) { if (screens[i] is CreateOrFindSessionScreen) { // If we found one, pop everything since then to return back to it. for (int j = i + 1; j < screens.Length; j++) screens[j].ExitScreen(); // Display the why-did-the-session-end message box. if (messageBox != null) screenManager.AddScreen(messageBox); return; } } // If we didn't find a CreateOrFindSessionsScreen, reset everything and // go back to the main menu. The why-did-the-session-end message box // will be displayed after the loading screen has completed. LoadingScreen.Load(screenManager, false, new BackgroundScreen(NetworkSessionComponent.Level.shipMap), new MainMenuScreen(), messageBox); }
// Audio audioHelper) public static void LeaveSessionFromGame(ScreenManager screenManager, AudioManager audioManager) { // Search through Game.Components to find the NetworkSessionComponent. foreach (IGameComponent component in screenManager.Game.Components) { NetworkSessionComponent self = component as NetworkSessionComponent; if (self != null) { // Display a message box to confirm the user really wants to leave. string message; if (self.networkSession.IsHost) message = Resources.ConfirmEndSession; else message = Resources.ConfirmLeaveSession; MessageBoxScreen confirmMessageBox = new MessageBoxScreen(message); // Hook the messge box ok event to actually leave the session. confirmMessageBox.Accepted += delegate { self.LeaveSessionFromGame(audioManager);//audioHelper); }; screenManager.AddScreen(confirmMessageBox); break; } } }
/// <summary> /// Internal method for leaving the network session. This disposes the /// session, removes the NetworkSessionComponent, and returns the user /// to the main menu screen. /// </summary> void LeaveSession() { // Remove the NetworkSessionComponent. Game.Components.Remove(this); // Remove the NetworkSession service. Game.Services.RemoveService(typeof(NetworkSession)); // Dispose the NetworkSession. networkSession.Dispose(); networkSession = null; // If we have a sessionEndMessage string explaining why the session has // ended (maybe this was a network disconnect, or perhaps the host kicked // us out?) create a message box to display this reason to the user. MessageBoxScreen messageBox; if (!string.IsNullOrEmpty(sessionEndMessage)) { messageBox = new MessageBoxScreen(sessionEndMessage, false); } else { messageBox = null; } // At this point we normally want to return the user all the way to the // main menu screen. But what if they just joined a session? In that case // they went through this flow of screens: // // - MainMenuScreen // - CreateOrFindSessionsScreen // - JoinSessionScreen (if joining, skipped if creating a new session) // - LobbyScreeen // // If we have these previous screens on the history stack, and the user // backs out of the LobbyScreen, the right thing is just to pop off the // LobbyScreen and JoinSessionScreen, returning them to the // CreateOrFindSessionsScreen (we cannot just back up to the // JoinSessionScreen, because it contains search results that will no // longer be valid). But if the user is in gameplay, or has been in // gameplay and then returned to the lobby, the screen stack will have // been emptied. // // To do the right thing in both cases, we scan through the screen history // stack looking for a CreateOrFindSessionScreen. If we find one, we pop // any subsequent screens so as to return back to it, while if we don't // find it, we just reset everything and go back to the main menu. GameScreen[] screens = screenManager.GetScreens(); // Look for the CreateOrFindSessionsScreen. for (int i = 0; i < screens.Length; i++) { if (screens[i] is CreateOrFindSessionScreen) { // If we found one, pop everything since then to return back to it. for (int j = i + 1; j < screens.Length; j++) { screens[j].ExitScreen(); } // Display the why-did-the-session-end message box. if (messageBox != null) { screenManager.AddScreen(messageBox); } return; } } // If we didn't find a CreateOrFindSessionsScreen, reset everything and // go back to the main menu. The why-did-the-session-end message box // will be displayed after the loading screen has completed. LoadingScreen.Load(screenManager, false, new BackgroundScreen(NetworkSessionComponent.Level.shipMap), new MainMenuScreen(), messageBox); }