Spiele Tutorial.. Findet Bilddateien nicht

Mr. Moon

Mitglied
Hallo, ich mache zur Zeit dieses Tutorial: http://archon.bplaced.net/bain09/Studium/Programmieren/Java/Turorials/Spiele/Tutorial%20f%FCr%20Java-Spiele%20.pdf

Ich habe alles genauso gemacht wie im Tutorial bis zu dem Punkt wo man angeblich den Helikopter steuern kann. Der öffnet zwar das Fenster aber ich habe 0 FPS und zur Laufzeit bekomme ich folgenden Fehler: Exception in thread "main" java.lang.IllegalArgumentException: input == null!
at javax.imageio.ImageIO.read(Unknown Source)
at GamePanel.loadPics(GamePanel.java:64)
at GamePanel.doInitializations(GamePanel.java:49)
at GamePanel.<init>(GamePanel.java:42)
at GamePanel.main(GamePanel.java:153)

Ich habe es auch schon mit absolutem Pfad probiert, sowie \ und / .. Ich habe echt keine Ahnung und bin für jede Hilfe dankbar.

Java:
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import java.util.Vector;

public class GamePanel extends JPanel implements Runnable, KeyListener {
    
	private static final long serialVersionUID = 1L;
	boolean game_running = true;
	
	long delta = 0;
	long last  = 0;
	long fps   = 0;
	
	boolean up    = false;
	boolean down  = false;
	boolean left  = false;
	boolean right = false;
	int speed = 50;
	Sprite mj;
	Vector<Sprite> actors;
	
	public GamePanel(int w, int h) {
		this.setPreferredSize(new Dimension(w,h));
		JFrame frame = new JFrame("BomberMJ");
		frame.setLocation(100,100);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.addKeyListener(this);
		frame.add(this);
		frame.pack();
		frame.setVisible(true);
		doInitializations();
	}
	
	private void doInitializations() {
	    last = System.nanoTime();
		
	    actors = new Vector<Sprite>();
	    BufferedImage[] player = this.loadPics("pics/test.gif", 4);
	    mj = new Sprite(player, 400, 300, 100, this);
	    actors.add(mj);
		Thread t = new Thread(this);
	    t.start();
	}
	
	private BufferedImage[] loadPics(String path, int pics) {
		
		BufferedImage[] anim = new BufferedImage[pics];
		BufferedImage source = null;
		
		URL pic_url = getClass().getClassLoader().getResource(path);
		
		try {
			source = ImageIO.read(pic_url);
		}
		
		catch(IOException e) {
			
		}
		
		for(int x = 0; x < pics; x++) {
			anim[x] = source.getSubimage(x * source.getWidth() / pics, 0, source.getWidth() / pics, source.getHeight());
		}
		
		return anim;
	}
	private void computeDelta() {
		delta = System.nanoTime() - last;
		last  = System.nanoTime();
		
		fps = ((long) 1e9) / delta;
	}
	
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		
		g.setColor(Color.red);
		g.drawString("FPS: " + Long.toString(fps), 20, 10);
		
		if(actors != null) {
			for(Drawable draw : actors) {
				draw.drawObjects(g);
			}
		}
	}
	
	private void doLogic() {
		for(Movable mov : actors) {
			mov.doLogic(delta);
		}
	}
	
	private void moveObjects() {
		for(Movable mov : actors) {
			mov.move(delta);
		}
	}
	
	private void checkKeys() {
		if(up) {
			mj.setVerticalSpeed(-speed);
		}
		
		if(down) {
			mj.setVerticalSpeed(speed);
		}
		
		if(right) {
			mj.setHorizontalSpeed(speed);
		}
		
		if(left) {
			mj.setHorizontalSpeed(-speed);
		}
		
		if(!up && !down) {
			mj.setVerticalSpeed(0);
		}
		
		if(!left && !right) {
			mj.setHorizontalSpeed(0);
		}
	}
	public void run() {
		while(game_running) {
		    computeDelta();
		    checkKeys();
		    doLogic();
		    moveObjects();
		    
		    repaint();
			
			
			try {
				Thread.sleep(10);
			}
			
			catch (InterruptedException e) {}
		}
	}
	public static void main(String[] args) {
		
		new GamePanel(800,600);
	}

	@Override
	public void keyPressed(KeyEvent e) {
		// TODO Auto-generated method stub
		
		if(e.getKeyCode() == KeyEvent.VK_UP) {
			up = true;
		}
		
		if(e.getKeyCode() == KeyEvent.VK_DOWN) {
			down = true;
		}
		
		if(e.getKeyCode() == KeyEvent.VK_LEFT) {
			left = true;
		}
		
		if(e.getKeyCode() == KeyEvent.VK_RIGHT) {
			right = true;
		}
	}

	@Override
	public void keyReleased(KeyEvent e) {
		// TODO Auto-generated method stub
		
		if(e.getKeyCode() == KeyEvent.VK_UP) {
			up = false;
		}
		
		if(e.getKeyCode() == KeyEvent.VK_DOWN) {
			down = false;
		}
		
		if(e.getKeyCode() == KeyEvent.VK_LEFT) {
			left = false;
		}
		
		if(e.getKeyCode() == KeyEvent.VK_RIGHT) {
			right = false;
		}
	}

	@Override
	public void keyTyped(KeyEvent arg0) {
		// TODO Auto-generated method stub
		
	}
}
 
Benutzt du zufällig IntelliJ?

Ich hatte das Problem das seltsamer Weise keine GIF Bilder geladen werden konnten.
Versuche einmal anstelle des GIFs ein PNG zu verwenden. (Einfach mit Paint oder so das Format ändern^^)
Ich habe absolut keine Erklärung für dieses Problem und habe selbst Stunden damit Verbracht eine Lösung zu finden. Nur das PNG konnte helfen.
Bei Ecplise im Gegenzug haben GIFs problemlos funktioniert.

MfG,
Toriath

EDIT: Ich wäre immernoch glücklich wenn mir jemand erklären könnte warum dies so ist 🙂
 
Zuletzt bearbeitet:
Nun, dann probiere mal
Code:
.getClassLoader()
weg zu lassen oder anstelle davon:
Java:
URL pic_url = getClass().getClassLoader().getResource(path);        
        try {
            source = ImageIO.read(pic_url);
        }
        
        catch(IOException e) {            
        }

Das hier zu verwenden:
Java:
InputStream inputStream = getClass()getResourceAsStream(path);
        
        try {
            source = ImageIO.read(inputStream);
        }
        
        catch(IOException e) {
            
        }

Bin mir grade nicht 100% sicher aber ich denke so sollte es richtig sein.
 
Das mit dem obigen Code geht auch nicht. Ich habe es jetzt auf meinem anderen Linux Rechner getestet und da geht es. Kann mir einer vielleicht sagen, woran das liegen könnte?

edit: Ich benutze auf meinem Hauptrechner Windows 7
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben