GAME DESIGN IN LIBGDX

GUIDE – GAME STATE/LEVELS

separator-blank.png

LEVELS

We can use this gameState setup to separate our program into sections that are each concerned with a different level (or intro).

STRATEGY EXPLANATION

We have an integer that keeps track of the current gameState.  The render method is separated into different sections that are executed only if they correspond to the current gameState.

Here is a pseudocode:

     Clear the screen
     If game state is 1
         Draw corresponding information
     If game state is 2

         Draw corresponding information

    

CODE

 

There are two classes in the code.   The Levels class is quite long but easy to understand if you break it apart considering all the IF statements.

public class Mario

{

   private float x;

   private float y;

  

   public Mario(int level)

   {

         if (level==1)

         {

               x=10;

               y=150;

         }

         else if (level==2)

         {

               x=600;

               y=100;

         }

   }

  

   public float getX()

   {

         return x;

   }

  

   public float getY()

   {

         return y;

   }

  

   public void moveRight(float amount)

   {

         x = x + amount;

   }

  

   public void moveLeft(float amount)

   {

         x = x - amount;

   }

}

public class Levels extends ApplicationAdapter

{

   private ShapeRenderer shapeRenderer;

   private SpriteBatch spriteRenderer;

   private BitmapFont font;

 

   private int gameState;

   private Mario mario;

  

   private final int INTRO = 1;

   private final int LEVEL1INTRO = 2;

   private final int LEVEL1 = 3;

   private final int LEVEL1CONC = 4;

   private final int LEVEL2INTRO = 5;

   private final int LEVEL2 = 6;

   private final int GAMEDONE = 7;

 

   @Override

   public void create ()

   {

      shapeRenderer = new ShapeRenderer();

      spriteRenderer = new SpriteBatch(); 

      FileHandle myFile3 = Gdx.files.internal("PressStart2p.fnt");

      font = new BitmapFont(myFile3);

     

      gameState = 1;

   }

 

   @Override

   public void render()

   { 

        //Clear the screen

        Gdx.gl.glClearColor(0, 0, 0, 1);

        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

       

        if (gameState == INTRO)

        {

              //Render

              spriteRenderer.begin();

              font.draw(spriteRenderer,"Super Mario", 50, 400);

              font.draw(spriteRenderer,"Version 0.001", 5, 250);

              font.draw(spriteRenderer,"Press Space", 50, 50);

              spriteRenderer.end();

             

              //Update

              if(Gdx.input.isKeyJustPressed(Input.Keys.SPACE))

              {

                    gameState++;

              }

        }  

        else if (gameState == LEVEL1INTRO)

        {

              //Render

              spriteRenderer.begin();

              font.draw(spriteRenderer,"Level 1", 150, 400);

              font.draw(spriteRenderer,"Press Space", 50, 50);

              spriteRenderer.end();

             

              //Update

              if(Gdx.input.isKeyJustPressed(Input.Keys.SPACE))

              {

                    gameState++;

                    mario = new Mario(1);

              }

        }

        else if (gameState == LEVEL1)

        {

              shapeRenderer.begin(ShapeType.Filled);

             

              //Render the ground

              shapeRenderer.setColor(Color.WHITE);

              shapeRenderer.rect(0,0,Gdx.graphics.getWidth(),100);

             

              //Render Mario

              shapeRenderer.setColor(Color.RED);

              shapeRenderer.circle(mario.getX(), mario.getY(), 50);

             

              //Render goal

              shapeRenderer.setColor(Color.WHITE);

              shapeRenderer.rect(Gdx.graphics.getWidth()-50,100,10,150);

              shapeRenderer.triangle(Gdx.graphics.getWidth()-60,250,Gdx.graphics.getWidth()-60,200,Gdx.graphics.getWidth()-110,225);

             

              shapeRenderer.end();         

 

              //Update

             

              //Update Mario's Location

              if(Gdx.input.isKeyPressed(Input.Keys.RIGHT))

              {

                    mario.moveRight(5);

              }

              if(Gdx.input.isKeyPressed(Input.Keys.LEFT))

              {

                    mario.moveLeft(5);

              }

             

              //Check for end of level

              if(mario.getX() > Gdx.graphics.getWidth()-50)  //if at flag

              {

                    gameState++;   //go to next state

              }    

             

        }

        else if(gameState == LEVEL1CONC)

        {

              //Render

              spriteRenderer.begin();

              font.draw(spriteRenderer,"Congrats!", 80, 400);

              font.draw(spriteRenderer,"Press Space", 50, 50);

              spriteRenderer.end();

             

              //Update

              if(Gdx.input.isKeyJustPressed(Input.Keys.SPACE))

              {

                    gameState++;

                    mario = new Mario(2);

              }

        }

        else if (gameState == LEVEL2INTRO)

        {

              //Render

              spriteRenderer.begin();

              font.draw(spriteRenderer,"Level 2", 150, 400);

              font.draw(spriteRenderer,"Press Space", 50, 50);

              spriteRenderer.end();

             

              //Update

              if(Gdx.input.isKeyJustPressed(Input.Keys.SPACE))

              {

                    gameState++;

                    mario = new Mario(2);

              }

        }

        else if (gameState == LEVEL2)

        {

              shapeRenderer.begin(ShapeType.Filled);

             

              //Render the ground

              shapeRenderer.setColor(Color.WHITE);

              shapeRenderer.rect(0,0,Gdx.graphics.getWidth(),50);

             

              //Render Mario

              shapeRenderer.setColor(Color.RED);

              shapeRenderer.circle(mario.getX(), mario.getY(), 50);

             

              //Render goal

              shapeRenderer.setColor(Color.WHITE);

              shapeRenderer.rect(70,50,10,150);

              shapeRenderer.triangle(60,200,60,150,0,175);

             

              shapeRenderer.end();         

 

              //Update

             

              //Update Mario's Location

              if(Gdx.input.isKeyPressed(Input.Keys.RIGHT))

              {

                    mario.moveRight(5);

              }

              if(Gdx.input.isKeyPressed(Input.Keys.LEFT))

              {

                    mario.moveLeft(5);

              }

             

              //Check for end of level

              if(mario.getX() < 50)  //if at flag pole

              {

                    gameState++;   //go to next state

              }  

        }

        else if (gameState == GAMEDONE)

        {

              //Render

              spriteRenderer.begin();

              font.draw(spriteRenderer,"Congrats", 150, 400);

              font.draw(spriteRenderer,"You saved", 125, 100);

              font.draw(spriteRenderer,"the princess", 50, 50);

              spriteRenderer.end();

             

              //Update

              if(Gdx.input.isKeyJustPressed(Input.Keys.SPACE))

              {

                    gameState=INTRO;  //restart game

              }

        }

   }

}

 


JAR FILE

Click here.


separator-campeau.png