Voila une manière qui, selon moi, simplifie la gestion "d'interface" au sein d'un jeu XNA.
Prenez le bon vieux jeu de course traditionnel qui, avant de jouer, on passe par les étapes suivantes:
SplasScreen > MainMenu > MenuChoixCourse > MenuChoixVoiture > Loading > On joue > Générique > on quitte
Eh bien ce projet offre une DLL permettant au plus simple de faire toutes ces interfaces et de les gérer.
Cette solution contient un projet DLL et un projet démo qui utilise les différentes interfaces.
Cette solution nécessite ceci pour compiler:
VC# 2005 express
XNA 1.0 Framework Refresh
Source / Exemple :
// Voici un exemple du code complet de Game1.cs, ici MyGame.cs.
// La gestion du jeu se fait a l'intérieur des classes GameState.
#region Using Statements
using System;
using System.Collections.Generic;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Storage;
using GameStateDLL; // Apres avoir mis en référence au projet, il faut insérer le using !
#endregion
namespace GameStateDemo
{
public class MyGame : Microsoft.Xna.Framework.Game
{
GraphicsDeviceManager graphics;
ContentManager content;
// Notre SpriteBatch utilisé
SpriteBatch spriteBatch;
// Notre SpriteFont utilisé
SpriteFont spriteFont;
// Le state actuel du jeu
public static BaseGameState CurrentState;
public MyGame()
{
graphics = new GraphicsDeviceManager( this );
content = new ContentManager( Services );
}
protected override void Initialize()
{
// On charge ici notre Font
spriteFont = content.Load<SpriteFont>( "SpriteFont1" );
// On charge ici notre SpriteBatch
spriteBatch = new SpriteBatch( graphics.GraphicsDevice );
// Ici on met le GameState de départ a notre jeu
MyGame.CurrentState = new MySplashGameState( this, spriteFont, spriteBatch );
base.Initialize();
}
protected override void LoadGraphicsContent( bool loadAllContent )
{
if ( loadAllContent )
{
}
}
protected override void UnloadGraphicsContent( bool unloadAllContent )
{
if ( unloadAllContent )
{
content.Unload();
}
}
protected override void Update( GameTime gameTime )
{
if ( GamePad.GetState( PlayerIndex.One ).Buttons.Back == ButtonState.Pressed )
this.Exit();
// Ici on agit pour que la gestion du Update ce fasse par le GameState
MyGame.CurrentState.Update( gameTime );
base.Update( gameTime );
}
protected override void Draw( GameTime gameTime )
{
graphics.GraphicsDevice.Clear( Color.White );
// Ici on agit pour que la gestion du Draw ce fasse par le GameState
spriteBatch.Begin( SpriteBlendMode.AlphaBlend );
MyGame.CurrentState.Draw( gameTime );
spriteBatch.End();
base.Draw( gameTime );
}
}
}
Conclusion :
Je suis ouvert a tous commentaire. Personnelement je me sert des ces gamstate pour me faciliter la tâche, j'aimerais quand même savoir si vous sa vous facilite la tâche, ou si vous avez une autre technique ! :)