2015-04-21 3 views
1

Итак, я следую серии учебников, чтобы узнать, как сделать игру в java (я все еще довольно новый), и я думаю, что я точно следил за его кодом, но он по-прежнему печатает трассировку стека когда я запускаю его. Вот мой код ...Cant read input file-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; 
    } 
} 

Теперь вот StackTrace показывает вверх:

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) 

Может ли кто-нибудь помочь? КСТАТИ: 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 был в моей папке «Рес», и мне нужно, чтобы добавить его в путь сборки

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, или относительный путь относительно пакета текущего класса ,