XNA IScreen code
Tags: csharp, xna, gamedev
Published: 2011-08-26 23:13:00

---
cover_image: https://dev-to-uploads.s3.amazonaws.com/i/y9hxcwi5y92j6zfcxbjx.jpg
title: XNA IScreen code
slug: xna-iscreen-code
date: 2011-08-26 23:13
tags:
 - csharp
 - xna
 - gamedev
---
I have been doing some XNA, and in order to utilise some sort of game screen system without using a Microsoft version, I've created this. Some parts have been borrowed from the internet, such as ServiceExtensionMethods, but it works very well.

IScreen.cs

	using Microsoft.Xna.Framework;

	namespace IScreenSystem
	{
	    public interface IScreen
	    {
	        void Update(GameTime gameTime);
	        void Draw(GameTime gameTime);
	    }
	}

ServiceExtensionMethods.cs

    using Microsoft.Xna.Framework;

    namespace IScreenSystem
    {
        static class ServiceExtensionMethods
        {
            public static void AddService<t>
                (this GameServiceContainer services, T service)
            {
                services.AddService(typeof(T), service);
            }

            public static T GetService<t>(this GameServiceContainer services)
            {
                return (T)services.GetService(typeof(T));
            }
        }
    }

VariableService.cs (Edit: removed IVariableService as it wasn't needed)

    using Microsoft.Xna.Framework;
    using Microsoft.Xna.Framework.Graphics;
    using Microsoft.Xna.Framework.Content;

    namespace IScreenSystem
    {
        public class VariableService
        {
            public Game Game { get; set; }
            public GraphicsDeviceManager Graphics { get; set; }
            public GraphicsDevice GraphicsDevice { get; set; }
            public ContentManager Content { get; set; }
            public SpriteBatch SpriteBatch { get; set; }
            public IScreen CurrentScreen { get; set; }
        }

    }

TestScreen.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using Microsoft.Xna.Framework;
    using Microsoft.Xna.Framework.Audio;
    using Microsoft.Xna.Framework.Content;
    using Microsoft.Xna.Framework.GamerServices;
    using Microsoft.Xna.Framework.Graphics;
    using Microsoft.Xna.Framework.Input;
    using Microsoft.Xna.Framework.Media;

    namespace IScreenSystem
    {
        class TestScreen : IScreen
        {
            private VariableService vars;

            public TestScreen(Game game)
            {
                vars = ServiceExtensionMethods
                    .GetService<variableservice>(game.Services);
            }

            public void Update(GameTime gameTime)
            {
                // to change screen, simply
                // vars.CurrentScreen = new TestScreen(vars.Game);
            }

            public void Draw(GameTime gameTime)
            {
                vars.GraphicsDevice.Clear(Color.Black);
            }

        }
    }

Game1.cs

    using Microsoft.Xna.Framework;
    using Microsoft.Xna.Framework.Graphics;

    namespace IScreenSystem
    {
        public class Game1 : Microsoft.Xna.Framework.Game
        {
            private VariableService vars;
            private GraphicsDeviceManager graphics;

            public Game1()
            {
                graphics = new GraphicsDeviceManager(this);
                Content.RootDirectory = "Content";
            }

            protected override void Initialize()
            {
                base.Initialize();
            }

            protected override void LoadContent()
            {
                ServiceExtensionMethods.AddService<variableservice>
                    (this.Services, new VariableService());

                vars = ServiceExtensionMethods
                    .GetService<variableservice>(this.Services);
                vars.Game = this;
                vars.Content = Content;
                vars.Graphics = graphics;
                vars.GraphicsDevice = graphics.GraphicsDevice;
                vars.SpriteBatch = new SpriteBatch(GraphicsDevice);
                vars.CurrentScreen = new TestScreen(this);
            }

            protected override void UnloadContent() { }

            protected override void Update(GameTime gameTime)
            {
                vars.CurrentScreen.Update(gameTime);
                base.Update(gameTime);
            }

            protected override void Draw(GameTime gameTime)
            {
                GraphicsDevice.Clear(Color.CornflowerBlue);
                vars.CurrentScreen.Draw(gameTime);
                base.Draw(gameTime);
            }
        }
    }

If you need it explaining more, leave a comment.