2012-11-03 51 views
-1

我使用Slick在Java中製作了這款2D遊戲。這個問題似乎是在此代碼:當使用For-loop在屏幕上繪製ImageArray時,請繼續在屏幕上繪圖/製作.jar時,它不會執行

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

這裏是我的所有代碼:

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

} 

- 這是我第一次使用計算器,所以如果這是完全不可讀的,告訴我,我應該做的,而不是上傳所有的代碼..在

謝謝提前!

+2

考慮更詳細地解釋你的問題。 –

+2

傾銷您的所有代碼不是要走的路。試着找出確切的位置並解釋出了什麼問題。也試着告訴我們你試圖解決你的問題。 – Styxxy

回答

1

問題是最有可能與資源加載。您加載圖像文件,當他們解壓它的工作原理,但是當他們在罐子,你應該使用Class.getResourceAsStream

例如圖像是jar文件與以下res/image.jpg那麼你應該使用getClass().getResourceAsStream("/res/image.jpg")訪問。然後你可以使用這個流讀取圖像內容。

+0

哪裏?當我初始化圖像變量? - 我的其他問題呢?當我在Eclipse中執行此操作時,它會持續將紅色'n'藍色球加載到屏幕上,直到紅色球在用戶字段中「產生」,所以遊戲結束。爲什麼Play類中的initRedAndBlueBall方法中的for循環繼續?我做錯了什麼? – user1149413

+1

@ user1149413,解釋「繼續前進」的意思是 –

+0

就像是一個沒有結束的循環,在遊戲結束前似乎沒有停止,GAME OVER – user1149413