#region File Description
//-----------------------------------------------------------------------------
// CreateOrFindSessionScreen.cs
//
// Microsoft XNA Community Game Platform
// Copyright (C) Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------------------------
#endregion
#region Using Statements
using System;
using System.Collections.Generic;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Net;
using Microsoft.Xna.Framework.GamerServices;
#endregion
namespace NetworkStateManagement
{
///
/// This menu screen lets the user choose whether to create a new
/// network session, or search for an existing session to join.
///
class CreateOrFindSessionScreen : MenuScreen
{
#region Fields
NetworkSessionType sessionType;
#endregion
#region Initialization
///
/// Constructor fills in the menu contents.
///
public CreateOrFindSessionScreen (NetworkSessionType sessionType)
: base(GetMenuTitle(sessionType))
{
this.sessionType = sessionType;
// Create our menu entries.
MenuEntry createSessionMenuEntry = new MenuEntry (Resources.CreateSession);
MenuEntry findSessionsMenuEntry = new MenuEntry (Resources.FindSessions);
MenuEntry backMenuEntry = new MenuEntry (Resources.Back);
// Hook up menu event handlers.
createSessionMenuEntry.Selected += CreateSessionMenuEntrySelected;
findSessionsMenuEntry.Selected += FindSessionsMenuEntrySelected;
backMenuEntry.Selected += OnCancel;
// Add entries to the menu.
MenuEntries.Add (createSessionMenuEntry);
MenuEntries.Add (findSessionsMenuEntry);
MenuEntries.Add (backMenuEntry);
}
///
/// Helper chooses an appropriate menu title for the specified session type.
///
static string GetMenuTitle (NetworkSessionType sessionType)
{
switch (sessionType) {
case NetworkSessionType.PlayerMatch:
return Resources.PlayerMatch;
case NetworkSessionType.SystemLink:
return Resources.SystemLink;
default:
throw new NotSupportedException ();
}
}
#endregion
#region Event Handlers
///
/// Event handler for when the Create Session menu entry is selected.
///
void CreateSessionMenuEntrySelected (object sender, PlayerIndexEventArgs e)
{
try {
// Which local profiles should we include in this session?
IEnumerable localGamers =
NetworkSessionComponent.ChooseGamers (sessionType,
ControllingPlayer.Value);
// Begin an asynchronous create network session operation.
IAsyncResult asyncResult = NetworkSession.BeginCreate (
sessionType, localGamers,
NetworkSessionComponent.MaxGamers,
0, null, null, null);
// Activate the network busy screen, which will display
// an animation until this operation has completed.
NetworkBusyScreen busyScreen = new NetworkBusyScreen (asyncResult);
busyScreen.OperationCompleted += CreateSessionOperationCompleted;
ScreenManager.AddScreen (busyScreen, ControllingPlayer);
} catch (Exception exception) {
NetworkErrorScreen errorScreen = new NetworkErrorScreen (exception);
ScreenManager.AddScreen (errorScreen, ControllingPlayer);
}
}
enum SessionProperty{ GameMode, SkillLevel, ScoreToWin }
enum GameMode{ Practice, Timed, CaptureTheFlag }
enum SkillLevel{ Beginner, Intermediate, Advanced }
///
/// Event handler for when the asynchronous create network session
/// operation has completed.
///
void CreateSessionOperationCompleted (object sender,
OperationCompletedEventArgs e)
{
try {
// End the asynchronous create network session operation.
NetworkSession networkSession = NetworkSession.EndCreate (e.AsyncResult);
// Create a component that will manage the session we just created.
NetworkSessionComponent.Create (ScreenManager, networkSession);
// Go to the lobby screen. We pass null as the controlling player,
// because the lobby screen accepts input from all local players
// who are in the session, not just a single controlling player.
ScreenManager.AddScreen (new LobbyScreen (networkSession), null);
} catch (Exception exception) {
NetworkErrorScreen errorScreen = new NetworkErrorScreen (exception);
ScreenManager.AddScreen (errorScreen, ControllingPlayer);
}
}
///
/// Event handler for when the Find Sessions menu entry is selected.
///
void FindSessionsMenuEntrySelected (object sender, PlayerIndexEventArgs e)
{
try {
// Which local profiles should we include in this session?
IEnumerable localGamers =
NetworkSessionComponent.ChooseGamers (sessionType,
ControllingPlayer.Value);
// Begin an asynchronous find network sessions operation.
IAsyncResult asyncResult = NetworkSession.BeginFind (sessionType,
localGamers, null, null, null);
// Activate the network busy screen, which will display
// an animation until this operation has completed.
NetworkBusyScreen busyScreen = new NetworkBusyScreen (asyncResult);
busyScreen.OperationCompleted += FindSessionsOperationCompleted;
ScreenManager.AddScreen (busyScreen, ControllingPlayer);
} catch (Exception exception) {
NetworkErrorScreen errorScreen = new NetworkErrorScreen (exception);
ScreenManager.AddScreen (errorScreen, ControllingPlayer);
}
}
///
/// Event handler for when the asynchronous find network sessions
/// operation has completed.
///
void FindSessionsOperationCompleted (object sender,
OperationCompletedEventArgs e)
{
GameScreen nextScreen;
try {
// End the asynchronous find network sessions operation.
AvailableNetworkSessionCollection availableSessions =
NetworkSession.EndFind (e.AsyncResult);
if (availableSessions.Count == 0) {
// If we didn't find any sessions, display an error.
availableSessions.Dispose ();
nextScreen = new MessageBoxScreen (Resources.NoSessionsFound, false);
} else {
// If we did find some sessions, proceed to the JoinSessionScreen.
nextScreen = new JoinSessionScreen (availableSessions);
}
} catch (Exception exception) {
nextScreen = new NetworkErrorScreen (exception);
}
ScreenManager.AddScreen (nextScreen, ControllingPlayer);
}
#endregion
}
}