-1

我用 Java 和 Slick 制作了这个 2D 游戏。问题似乎出在这段代码中:

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");
            }  
        }
    }

这是我的所有代码:

游戏.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();
      }
   }

}

菜单.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;
       }
    }

播放.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;
    }

}

- 这是我第一次使用stackoverflow,所以如果这完全不可读,请告诉我我应该做什么而不是上传所有代码..

提前致谢!

4

1 回答 1

1

问题很可能与资源加载有关。您将图像作为文件加载,当它们被解包时它可以工作,但是当它们在 jar 中时,您应该使用Class.getResourceAsStream

例如图像在 jar 文件中,可以通过以下方式访问,res/image.jpg那么您应该使用getClass().getResourceAsStream("/res/image.jpg"). 然后您可以使用此流读取图像内容。

于 2012-11-03T13:35:29.190 回答