-1

I made this 2D game in Java, with Slick. The problem seems to be in this code:

public void initRedAndBlueBall() throws SlickException
    {           
       //   Makes sure the red and the blue ball aren't too close
        for(int i = 0; i <= amountOfEatenBalls; i++)
        {
            // Get random cordinates for the red and blue ball.
            randomRedX[i] = random.nextInt(550) + 24;
            randomRedY[i] = random.nextInt(350) + 24;
            randomBlueX = random.nextInt(550) + 24;
            randomBlueY = random.nextInt(350) + 24;

    // Initialize the new Redball with a picture.
    redball[i] = new Image("res/RedBall.png");
    // Draws the red ball on the screen. 
    drawRedBall(randomRedX[i], randomRedY[i], redball[i]);

    if(isInTheRangeOf(randomRedX[i], randomBlueX, 30) == false)
    {
        System.out.println("The red and the blue ball have good positions");
            break;
            }
            else if(isInTheRangeOf(randomRedX[i], randomBlueX, 30) == true)
            {
                System.out.println("The red and the blue ball are to close!");
                System.out.println("Repositioning the red and blue ball");
            }  
        }
    }

Here's all of my code:

Game.java

package javagame;

import org.newdawn.slick.*;
import org.newdawn.slick.state.*;

public class Game extends StateBasedGame
{

   public static final String gamename = "Mini Game";
   public static final int menu = 0;
   public static final int play = 1;
   public static final int gameOver = 2;
   public static final int windowX = 600;
   public static final int windowY = 400;

   public Game(String gamename)
   {
      super(gamename);
      this.addState(new Menu(menu));
      this.addState(new Play(play));
      this.addState(new GameOver(gameOver));
   }

   public void initStatesList(GameContainer gc) throws SlickException
   {
      this.getState(menu).init(gc, this);
      this.getState(play).init(gc, this);
      this.enterState(menu);
   }

   public static void main(String[] args) 
   {
      AppGameContainer appgc;
      try
      {
         appgc = new AppGameContainer(new Game(gamename));
         appgc.setDisplayMode(windowX, windowY, false);
         appgc.start();
      }
      catch(SlickException e)
      {
         e.printStackTrace();
      }
   }

}

Menu.java

 package javagame;

    import org.lwjgl.input.Mouse;
    import org.newdawn.slick.*;
    import org.newdawn.slick.state.*;
    import org.newdawn.slick.MouseListener;

    public class Menu extends BasicGameState
    {
        Image PlayNow, PlayNowHover, ExitGame, ExitGameHover, PlayButton, ExitGameButton;
        int MousePosX;
        int MousePosY;

       public Menu(int state)  {}

       public void init(GameContainer gc, StateBasedGame sbg) throws SlickException
       {
           // Billederne er 125x26
           PlayNow = new Image("res/PlayNow.png");
           PlayNowHover = new Image("res/PlayNowHover.png");
           ExitGame = new Image("res/ExitGame.png");
           ExitGameHover = new Image("res/ExitGameHover.png");

           PlayButton = PlayNow;
           ExitGameButton = ExitGame;
       }

       public void render(GameContainer gc, StateBasedGame sbg, Graphics g) throws SlickException
       {
           // Framet er 600x400
           g.drawString(MousePosX + ", " + MousePosY, 500, 10);
           g.drawLine(0, 26, 600, 26);

           g.drawImage(PlayButton, 200, 100);
           g.drawImage(ExitGameButton, 200, 150);

           g.drawString("You move with the arrowkeys.", 200, 200);
           g.drawString("There's 1 rule:", 200, 215);
           g.drawString("Don't eat the red balls!", 200, 230);
           g.drawString("But you can enjoy the blue ones :- P", 200, 245);
       }

       public void update(GameContainer gc, StateBasedGame sbg, int delta) throws SlickException
       {
              Input input = gc.getInput();
              MousePosX = input.getMouseX();
              MousePosY = input.getMouseY();

              // PlayNow Hover or Normal
              if(MousePosX > 200 && MousePosX < 325     &&      MousePosY > 100 && MousePosY < 126)
              {
                  PlayButton = PlayNowHover;
              }
              else
              {
                  PlayButton = PlayNow;
              }
              //ExitGame Hover or Normal
              if(MousePosX > 200 && MousePosX < 325     &&      MousePosY > 150 && MousePosY < 176)
              {
                  ExitGameButton = ExitGameHover;
              }
              else
              {
                  ExitGameButton = ExitGame;
              }

              // Now the buttons have a function
              if(MousePosX > 200 && MousePosX < 325     &&      MousePosY > 100 && MousePosY < 126)
              {
                  if(Mouse.isButtonDown(0))
                  {
                      sbg.enterState(1);
                  }
              }
              if(MousePosX > 200 && MousePosX < 325     &&      MousePosY > 150 && MousePosY < 176)
              {
                  if(Mouse.isButtonDown(0))
                  {
                      System.exit(0);
                  }
              }


       } 

       public int getID()
       {
          return 0;
       }
    }

Play.java

    package javagame;

import org.newdawn.slick.*;
import org.newdawn.slick.state.*;

import java.util.Random;

public class Play extends BasicGameState
{
    Image ball, blueball;
    Image[] redball;
    Animation roll;   

    int[] duration = {200, 200};
    float defBallPosX = 300; // DEFAULT
    float defBallPosY = 200; // DEFAULT
    float ballPosX = 300; 
    float ballPosY = 200; 
    int MousePosX;
    int MousePosY;
    Random random;
    float[] randomRedX; // X for the RedBall.png
    float[] randomRedY; // Y for the RedBall.png
    float randomBlueX; // X for the BlueBall.png
    float randomBlueY; // Y for the BlueBall.png

    static int amountOfEatenBalls;

    boolean blueAndRedAreNotToClose;

    public Play(int state)
    {

    }

    public void init(GameContainer gc, StateBasedGame sbg) throws SlickException
    {
        ball = new Image("res/PurpBallNorm.png"); // 25x25 px
        Image[] images = {ball, ball};

        redball = new Image[50];
        blueball = new Image("res/BlueBall.png");

        roll = new Animation(images, duration, false);

        random = new Random();

        randomRedX = new float[50];
        randomRedY = new float[50];

        amountOfEatenBalls = 0;
    }

    public void render(GameContainer gc, StateBasedGame sbg, Graphics g) throws SlickException
    {
       //   The Window is 600x400
        g.drawString(MousePosX + ", " + MousePosY, 500, 10);

        g.drawLine(0, 26, Game.windowX, 26); // Ceiling
        g.drawLine(1, 26, 1, Game.windowY); // Left Wall
        g.drawLine(Game.windowX - 2, 26, Game.windowX - 2, Game.windowY - 2); // Right Wall
        g.drawLine(1, Game.windowY - 2, Game.windowX - 2, Game.windowY - 2); // Floor

        roll.draw(ballPosX, ballPosY);

        initRedAndBlueBall(); 
    }

    public void update(GameContainer gc, StateBasedGame sbg, int delta) throws SlickException
    {
            Input input = gc.getInput();
            MousePosX = input.getMouseX();
            MousePosY = input.getMouseY();

            if(input.isKeyDown(Input.KEY_UP))
                ballPosY -= delta * .1f;
            else if(input.isKeyDown(Input.KEY_DOWN))
                ballPosY += delta * .1f;
            else if(input.isKeyDown(Input.KEY_LEFT))
                ballPosX -= delta * .1f;
            else if(input.isKeyDown(Input.KEY_RIGHT))
                ballPosX += delta * .1f;

            blueBallTouch(); 

            for(int i = 0; i <= amountOfEatenBalls; i++)
            {
                if(isInTheRangeOf(ballPosX, randomRedX[i], 25) == true && isInTheRangeOf(ballPosY, randomRedY[i], 25) == true)
                {
                    System.out.println("Player has eaten a red ball!");
                    sbg.enterState(2);
                }
            }

//          Makes sure the ball can't run out of the window
            if(ballPosX <= 2)
            {
                ballPosX += delta * .1f;
            }
            else if(ballPosX >= Game.windowX - 27)
            {
                ballPosX -= delta * .1f;
            }
            else if(ballPosY <= 26)
            {
                ballPosY += delta * .1f;
            }
            else if(ballPosY >= Game.windowY - 27)
            {
                ballPosY -= delta * .1f;
            }
    } 

    public int getID() 
    {
        return 1;
    }

    public boolean isInTheRangeOf(float x, float y, float range)
    {
            float a = 0;
            float b = 0;

            if(x > y)
            {
                a = x;
                b = y;
            }
            else if(y > x)
            {
                b = x;
                a = y;
            }   

            if((a - b) <= range)
            {
                return true;
            }
            else if((a - b) >= range)
            {
                return false;
            }
            return true;
    }

    public void initRedAndBlueBall() throws SlickException
    {           
       //   Makes sure the red and the blue ball aren't too close
        for(int i = 0; i <= amountOfEatenBalls; i++)
        {
            // Get random cordinates for the red and blue ball.
            randomRedX[i] = random.nextInt(550) + 24;
            randomRedY[i] = random.nextInt(350) + 24;
            randomBlueX = random.nextInt(550) + 24;
            randomBlueY = random.nextInt(350) + 24;

            // Initialize the new Redball with a picture.
            redball[i] = new Image("res/RedBall.png");
            // Draws the red ball on the screen. 
            drawRedBall(randomRedX[i], randomRedY[i], redball[i]);

            if(isInTheRangeOf(randomRedX[i], randomBlueX, 30) == false)
            {
                System.out.println("The red and the blue ball have good positions");
                break;
            }
            else if(isInTheRangeOf(randomRedX[i], randomBlueX, 30) == true)
            {
                System.out.println("The red and the blue ball are to close!");
                System.out.println("Repositioning the red and blue ball");
            }  
        }
    }

    public void drawRedBall(float x, float y, Image image)
    {
        Graphics g = new Graphics();
        g.drawImage(image, x, y);
    }

    public void blueBallTouch() throws SlickException
    {
        if(isInTheRangeOf(ballPosX, randomBlueX, 25) == true && isInTheRangeOf(ballPosY, randomBlueY, 25) == true)
        {
            amountOfEatenBalls++;

            initRedAndBlueBall();
        }
        else
        {

        }
   }

   public static int getAmountOfEatenBalls()
   {
       return amountOfEatenBalls;
   }

}

GameOver.java

package javagame;

import org.lwjgl.input.Mouse;
import org.newdawn.slick.*;
import org.newdawn.slick.state.*;

public class GameOver extends BasicGameState
{
    Image ExitGame, ExitGameHover, ExitGameButton;
    int MousePosX;
    int MousePosY;


    public GameOver(int state)
    {

    }

    public void init(GameContainer gc, StateBasedGame sbg) throws SlickException
    {
        ExitGame = new Image("res/ExitGame.png");
        ExitGameHover = new Image("res/ExitGameHover.png");

        ExitGameButton = ExitGame;
    }

    public void render(GameContainer gc, StateBasedGame sbg, Graphics g) throws SlickException
    {
        g.drawImage(ExitGameButton, 200, 100);
        g.drawString("You've eaten: " + Play.getAmountOfEatenBalls() + " balls!", 200, 190);
    }

    public void update(GameContainer gc, StateBasedGame sbg, int delta) throws SlickException
    {
        Input input = gc.getInput();
        MousePosX = input.getMouseX();
        MousePosY = input.getMouseY();

         if(MousePosX > 200 && MousePosX < 325  &&      MousePosY > 100 && MousePosY < 126)
          {
              ExitGameButton = ExitGameHover;
          }
          else
          {
              ExitGameButton = ExitGame;
          }

         if(MousePosX > 200 && MousePosX < 325  &&      MousePosY > 100 && MousePosY < 126)
          {
              if(Mouse.isButtonDown(0))
              {
                  System.exit(0);
              }
          }
    }

    public int getID()
    {
        return 2;
    }

}

-This is the first time I use stackoverflow, so if this is totally unreadable, tell me what I should do instead of uploading all the code..

Thanks in advance!

Hovercraft Full Of Eels
  • 283,665
  • 25
  • 256
  • 373

1 Answers1

1

The problem is most probably with resource loading. You load image as file, it works when they are unpacked, but when they are in jar you should use Class.getResourceAsStream

For example image is in jar file accessible with following res/image.jpg then you should use getClass().getResourceAsStream("/res/image.jpg"). Then you can read image contents using this stream.

michael nesterenko
  • 14,222
  • 25
  • 114
  • 182
  • Where? When I initialize the image variables? - How about my other problem? When I execute this in Eclipse, it keeps loading the red 'n' blue balls to the screen, until the red ball "spawns" in the userfield, so the game ends. Why does the for-loop in the initRedAndBlueBall method, in the Play class keep going? What did I do wrong? – Universal_Grammar_FTW Nov 03 '12 at 13:40
  • 1
    @user1149413, explain what `keep going` means – michael nesterenko Nov 03 '12 at 13:49
  • Like, a loop with no end, it doesn't seem to stop, before the game goes GAME OVER – Universal_Grammar_FTW Nov 04 '12 at 09:41