The Coder's Handbook

Game States

WHAT IS A GAME STATE?

For more detailed information, look at the GameState, BasicGameState and StateBaseGame classes in the Slick 2D Javadoc

Your Game States


  • Your game will often want to change into different modes that have different behaviors

  • For example:

    • Your Title state might display a name and ask the user to press "space" to start.

    • Your Gameplay state might render the action and has the user move around and shoot stuff.

    • Your Pause gameplay might display everything, but no objects actually move.

Adding Game States


In the Engine class...


// These integer constants store the codes for each state.

public static final int TITLE_ID = 0;

public static final int GAME_ID = 1;


// We declare a BasicGameState for each state

private BasicGameState title;

private BasicGameState game;


// In our constructor we initialize the game states with a code.

public Engine(String name)

{
super(name);

title = new Title(TITLE_ID);

game = new Game(GAME ID);

}


// Add states to our list. The first state we add is the starting state.

void initStatesList(GameContainer gc) throws SlickException

{

addState(title);

addState(game);

}


Adding the Title Class


If you're working with the Template... your program will probably have an error at this point.

  • It knows about the main gameplay state, but it doesn't know about title.

  • You'll need to add a "Title" game state to your project

  • To do so, click in the package explorer. Copy and Paste "Game.java" and name it "Title.java."

Label the Game States

Your project is a lot easier to read if we make both Game and Title have code displaying their states in render.

Here's the example code for Title. You'll want to do the same for Game.


public void render(GameContainer gc, StateBasedGame sbg, Graphics g) throws SlickException

{
// It makes it easier to tell what state we're in if we label it!

// This code draws the word "Title" near the top left corner of the screen.

g.drawString("TITLE", 50, 50);

}

Changing Game States

To change a Game State, we'll need to:

  • Have a reference to the Engine object. We'll call this sbg.

  • Switch states on a key press event


// Add a new instance field named sbg. This is a reference to the main Engine.
StateBasedGame sbg;

public void init(GameContainer gc, StateBasedGame sbg) throws SlickException

{
// Update our reference to the game Engine

this.sbg = sbg;

}

public void keyPressed(int key, char c)

{

// If the user presses ANY key, we switch to the Gameplay state

sbg.enterState(Engine.GAME_ID),

}


RESOURCES

The New Boston - Defining Game States

The New Boston - Adding Game States To Container

The New Boston - Main Method

The New Boston - Implementing Each Game State

The New Boston - How To Change States