[xna 1.0 refresh] gestion par gamestate

Description

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 ! :)

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.