2015-04-21 129 views
1

因此,我正在學習如何在java中製作遊戲(我還很新),並且我認爲我完全遵循了他的代碼,但它仍然會打印堆棧跟蹤當我運行它。這裏是我的代碼...不能讀取輸入文件-java

Game.java

package com.game.src.main; 

import java.awt.Canvas; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.image.BufferStrategy; 
import java.awt.image.BufferedImage; 
import java.io.IOException; 

import javax.swing.JFrame; 

public class Game extends Canvas implements Runnable{ 
    private static final long serialVersionUID = 1L; 
    public static final int WIDTH = 320; 
    public static final int HEIGHT = WIDTH/12 * 9; 
    public static final int SCALE = 2; 
    public final String TITLE = "2D Space Game"; 

    private JFrame frame = new JFrame(TITLE); 
    private boolean running = false; 
    private Thread thread; 
    private BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB); 
    private BufferedImage spriteSheet = null; 

    private BufferedImage player; 

    public void init(){ 
     BufferedImageLoader loader = new BufferedImageLoader(); 
     spriteSheet = loader.loadImage("/sprite_sheet.png"); 

     SpriteSheet ss = new SpriteSheet(spriteSheet); 
     player = ss.grabImage(1, 1, 32, 32); 
    } 

    public void run(){ 
     long lastTime = System.nanoTime(); 
     final double amountOfTicks = 60.0; 
     double ns = 1000000000/amountOfTicks; 
     double delta = 0; 
     long now = 0; 
     int updates = 0, frames = 0; 
     long timer = System.currentTimeMillis(); 

     init(); 
     while(running){ 
      now = System.nanoTime(); 
      delta += (now - lastTime)/ns; 
      lastTime = now; 
      if(delta >= 1){ 
       tick(); 
       updates++; 
       delta--; 
      } 
      render(); 
      frames++; 

      if(System.currentTimeMillis() - timer > 1000){ 
       timer += 1000; 
       frame.setTitle("2-D Space Game || Updates: " + updates + ", FPS: " + frames); 
       frames = 0; 
       updates = 0; 
      } 
     } 
     stop(); 
    } 

    private void tick(){ 

    } 

    private void render(){ 
     BufferStrategy bs = this.getBufferStrategy(); 
      try { 
       Thread.sleep(2); 
      } catch (InterruptedException e){ 
       e.printStackTrace(); 
      } 
     if(bs == null){ 
      createBufferStrategy(3); 
      return; 
     } 

     Graphics g = bs.getDrawGraphics(); 
     ///////////////////////////////////// 

     g.drawImage(image, 0, 0, getWidth(), getHeight(), this); 
     g.drawImage(player, 100, 100, this); 

     ///////////////////////////////////// 
     g.dispose(); 
     bs.show(); 
    } 

    private synchronized void start(){ 
     if(running) return; 
     running = true; 
     thread = new Thread(this); 
     thread.start(); 
    } 

    private synchronized void stop(){ 
     if(!running) return; 
     try{ 
      thread.join(); 
     }catch(InterruptedException e){ 
      e.printStackTrace(); 
     } 
     System.exit(1); 
    } 

    public static void main(String args[]){ 
     Game game = new Game(); 
     game.setPreferredSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE)); 
     game.setMaximumSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE)); 
     game.setMinimumSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE)); 

     game.frame.add(game); 
     game.frame.pack(); 
     game.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     game.frame.setResizable(false); 
     game.frame.setLocationRelativeTo(null); 
     game.frame.setVisible(true); 
     game.start(); 
    } 
} 

SpriteSheet.java

package com.game.src.main; 

import java.awt.image.BufferedImage; 

public class SpriteSheet { 
    private BufferedImage image; 

    public SpriteSheet(BufferedImage image){ 
     this.image = image; 
    } 

    public BufferedImage grabImage(int col, int row, int width, int height){ 
     return image.getSubimage((col * 32) - 32, (row * 32) - 32, width, height); 
    } 
} 

BufferedImageLoader.java

package com.game.src.main; 

import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 

import javax.imageio.ImageIO; 

public class BufferedImageLoader { 
    private BufferedImage image; 

    public BufferedImage loadImage(String path){ 
     try { 
      image = ImageIO.read(getClass().getResource(path)); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (IllegalArgumentException e) { 
      e.printStackTrace(); 
     } 
     return image; 
    } 
} 

現在,這裏是顯示了堆棧跟蹤:

Exception in thread "Thread-0" java.lang.IllegalArgumentException: input == null! 
    at javax.imageio.ImageIO.read(ImageIO.java:1388) 
    at com.game.src.main.BufferedImageLoader.loadImage(BufferedImageLoader.java:13) 
    at com.game.src.main.Game.init(Game.java:30) 
    at com.game.src.main.Game.run(Game.java:45) 
    at java.lang.Thread.run(Thread.java:745) 

任何人都可以幫忙嗎? BTW: sprite_sheet.png確實存在

+0

你把你的sprite_sheet.png文件放在哪裏?請確保它位於類路徑 –

+1

處的javax.imageio.ImageIO.read(ImageIO.java:1388)它在您提到的路徑中找不到名爲sprite_sheet.png的文件。 (/sprite_sheet.png)。嘗試給出絕對路徑,如/home/workspace/images/sprite_sheet.png – A1ternat1ve

回答

0

好吧,我明白了。我的sprite_sheet.png位於我的「res」文件夾中,我需要將其添加到構建路徑

0

這裏的問題是,你正在處理您的PNG的方式,並且您指定的位置是不是在你的構建路徑,或者你希望它是。如果你對你的位置給我提供了pwd我會與實際路徑更新,你應該使用

你要麼需要提供完整的路徑

/home/me/myprogram/sprite_sheet.png

,或者使用相對路徑

./sprite_sheet.png

您的程序正在尋找根目錄下的文件/

+0

這是一個資源,而不是文件。 – EJP

+0

我不理解你的評論 –

+0

你不明白這個問題。資源由'getResourceAsStream()'加載,並且相對於CLASSPATH命名。它不在文件系統中,除非JAR文件包含名爲'/ home/me/myprogram/sprite_sheet.png'的目錄,否則您的答案是100%錯誤。 – EJP

-1

您需要提供相對於CLASSPATH,或相對於當前類的包的相對路徑的完整路徑