2013-11-12 5 views
0

По какой-то причине моя программа не может найти изображение. Я пробовал абсолютно все и убедился, что путь к файлу точно. Он отлично работал в моей предыдущей игре, но теперь он просто не найдет изображение вообще.Java-игра не будет читать файл изображения

Entity Класс

package Entities; 

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

import javax.imageio.ImageIO; 

public class Entity 
{ 
    public double x, y, width, height, dx, dy; 

    public BufferedImage image; 

    public Entity(String s) 
    { 
     try 
     {  //error occurs here 
      image = ImageIO.read(getClass().getResourceAsStream(s)); 
     } 
     catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 

     width = image.getWidth(); 
     height = image.getHeight(); 
    } 

    public void update() 
    { 
     x += dx; 
     y += dy; 
    } 

    public void draw(Graphics2D g) 
    { 
     g.drawImage(image, (int)x, (int)y, null); 
    } 
} 

класс GamePanel

package Main; 

//import java.awt.Container; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.awt.image.BufferedImage; 

import javax.swing.JPanel; 

import Entities.Entity; 

@SuppressWarnings("serial") 
public class GamePanel extends JPanel implements Runnable, KeyListener 
{ 
    public static final int WIDTH = 320; 
    public static final int HEIGHT = 240; 
    public static final int SCALE = 2; 

    //game thread 
    private Thread thread; 
    private boolean running; 
    private int fps = 60; 
    private long targetTime = 1000/fps; 

    //image 
    private BufferedImage image; 
    private Graphics2D g; 

    //test 
    public Entity e; 

    public GamePanel() 
    { 
     super(); 
     setPreferredSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE)); 
     setFocusable(true); 
     requestFocus(); 
    } 

    public void addNotify() 
    { 
     super.addNotify(); 
     if(thread == null) 
     { 
      thread = new Thread(this); 
      addKeyListener(this); 
      thread.start(); 
     } 
    } 

    public void init() 
    { 
     image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB); 
     g = (Graphics2D) image.getGraphics(); 
     running = true; 

     e = new Entity("Resources/Test/test.png"); 
    } 

    @Override 
    public void keyPressed(KeyEvent key) 
    { 
     //p1.keyPressed(key.getKeyCode()); 
    } 

    @Override 
    public void keyReleased(KeyEvent key) 
    { 
     //p1.keyReleased(key.getKeyCode()); 
    } 

    @Override 
    public void keyTyped(KeyEvent arg0) 
    { 

    } 

    @Override 
    public void run() 
    { 
     init(); 

     long start; 
     long elapsed; 
     long wait; 

     //game loop 
     while(running) 
     { 
      start = System.nanoTime(); 

      update(); 
      draw(); 
      drawToScreen(); 

      elapsed = System.nanoTime() - start; 

      wait = targetTime - elapsed/1000000; 

      if(wait < 0) 
      { 
       wait = 5; 
      } 

      try 
      { 
       Thread.sleep(wait); 
      } 
      catch(Exception e) 
      { 
       e.printStackTrace(); 
      } 
     } 

    } 

    private void drawToScreen() 
    { 
     Graphics g2 = getGraphics(); 
     g2.drawImage(image, 0, 0, WIDTH * SCALE, HEIGHT * SCALE, null); 
     g2.dispose(); 

    } 

    private void draw() 
    { 
     //e.draw(g); 
    } 

    private void update() 
    { 

    } 
} 

Это ошибка

Exception in thread "Thread-2" java.lang.IllegalArgumentException: input == null! 
at javax.imageio.ImageIO.read(Unknown Source) 
at Entities.Entity.<init>(Entity.java:19) 
at Main.GamePanel.init(GamePanel.java:67) 
at Main.GamePanel.run(GamePanel.java:93) 
at java.lang.Thread.run(Unknown Source) 
+0

Вы используете затмение или какой-либо другой IDE? Где файл, расположенный по отношению к вашему проекту ? Является ли это в исходной папке? –

+0

выяснить, почему getClass(). GetResourceAsStream (s) возвращает null. По некоторым причинам, файла нет, файл не находится в указанном вами пути в 's', классе загрузчик, который вы получаете с 'getClass()', не является правильным – Hilikus

+0

1 - Каков путь к изображению в вашем проекте. 2. Какое значение использует использование для 's' – MadProgrammer

ответ

2

Путь Resources/Test/test.png предложить относительный путь от места ссылки класса используется, чтобы попытаться и загрузите его.

Так как вы используете ваш Entity класс, чтобы попытаться загрузить изображение и Entity находятся в Entities пакете, это будет создан абсолютный путь (из контекста пути типа) /Entities/Resources/Test/test.png, что, очевидно, неверно.

Попробуйте использовать /Resources/Test/test.png вместо (при условии, Resources находится на вершине дерева пути, к примеру ...

+ Resources 
    + Test 
    - test.png 
+ Entities 
    - Entity 
+ Main 
    - GamePanel 
Смежные вопросы