2D-Grafik NPE beim Zeichnen auf Graphics g

P

peebles

Gast
Hallo,

ich wollte mir eine Sprite-Klasse schreiben, zum "flüssigen" (ist relativ) Darstellen von Animationen,
durch widerholtes zeichnen verschiedener Bilder (hier: BufferedImage).

Habe mir auch schnell eine Klasse geschrieben, wahrscheinlich noch uneffizient aber das tut erst einmal nichts zur Sache.

Java:
public class Sprite {

	long delay;
	long animation = 0;
	int currentPic = 0;
	BufferedImage[] pics;
	BufferedImage[] aa;
	
	private int x,y, vx, vy;
	
	public Sprite(String path, int x, int y, long delay, int count) {
		this.setX(x);
		this.setY(y);
		this.delay = delay;
		currentPic = 0;
		aa = loadPics("pics/Sprite1.png", 4);
		this.setPics(aa);
	}
	
	public void setPics(BufferedImage[] pics) {
		this.pics = pics;
	}
	
	public BufferedImage[] getPics() {
		return pics;
	}
	
	public void draw(Graphics g) {
		g.drawImage(pics[currentPic], this.x, this.y, null);
	}
	
       //getter & setter weggelassen

	
	public void forceAnimation() {
		currentPic++;
		if (currentPic > pics.length-1) {
			currentPic = 0;
		}
	}
	
	public void checkNextPic(long delta) {
		animation += (delta/1000000);
		if (animation > delay)
		{
			animation = 0;
			forceAnimation();
		}
	}
	
	private BufferedImage[] loadPics(String path, int pics) {
		BufferedImage[] anim = new BufferedImage[pics];
		BufferedImage source = null;
		
		URL url = getClass().getClassLoader().getResource(path);
		try {
		source = ImageIO.read(url);
		} catch (IOException e) { }
		
		for (int x = 0; x < pics; x++) {
			anim[x] = source.getSubimage(x*source.getWidth()/pics, 0,                  //x1, y1
					                     source.getWidth()/pics, source.getHeight()); //x2, y2
		}
		
		return anim;
	}
}

In meiner Main-Loop ("Spielschleife") wird dann wie gehabt it repaint() eine Anfrage gestellt, wobei dann paintComponent aufgerufen wird:

Java:
public void paintComponent(Graphics g) {
		super.paintComponent(g);
		
		g.drawString("FPS " + Long.toString(fps), 10, 20);
		
		if (!input.getRunningState()) {
			return;
		}
		
		block.draw(g);
		sprite.draw(g);
}

Bei
Java:
sprite.draw(g);
kriege ich eine NullPointerException, obwohl (!) das Programm ordnungsgemäß startet und auch sogar zeichnet, so wie es sein soll.

Das Bild ist also garantiert nicht null und wird richtig geladen, sowie in kleine Einzelteile zerschnitten.

Jemand eine Idee?

Danke
 

bERt0r

Top Contributor
Da du pics nicht initialisierst, muss bevor du ein Sprite zeichnen kannst setPicks mit einem gültigen Array als Parameter aufgerufen werden. Davon seh ich in deinem Code nix, am besten wäre, du postest ein KSKB.
 
P

peebles

Gast
Also ich rufe
Java:
 setPics(aa)
auf, und davor doch
Java:
 aa = loadPics(...)
und loadPics(...) liefert ein gültiges Array zurück, nämlich anim[].
Also wird doch auch "aa" initialisiert?
Dann hat pics[] den Wert von aa[].

Ich habe schon versucht zu debuggen, aber bin leider nicht fündig geworden.
Und was ist ein KSKB?
 
P

peebles

Gast
Mein Fehler, sorry.

Hier das KSKB, jedoch braucht ihr ein Bild im angegeben Verzeichnis, damit es funktioniert.
Anbei meine Klassen

Main:
Java:
import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Main extends JPanel implements Runnable { 
	
	private static final long serialVersionUID = 1L;
	JFrame frame;
	Sprite sprite;
	long delta, last = 0;
	
	public Main(int w, int h) {
		this.setPreferredSize(new Dimension(w, h));
		frame = new JFrame("Blocks2D");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.add(this);
		frame.pack();
		frame.setResizable(false);
		frame.setVisible(true);
		
		init();
		
		Thread t = new Thread(this);
		t.start();
	}

	@Override
	public void run() {
		while(true) {
			newDelta();	
			repaint();
			try {
			Thread.sleep(10);
			} catch (InterruptedException e) { }
		}
	}
	
	private void newDelta() {
		delta = System.nanoTime() - last;
		last = System.nanoTime();
		
		sprite.checkNextPic(delta);
	} 
	
	public void init() {
		last = System.nanoTime(); 
		sprite = new Sprite("pics/Sprite1.png", 100, 100, 200, 4);
	}
	
	@Override
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		
		sprite.draw(g);
	}

	
	public static void main(String[] args) {
		new Main(800, 600);
	}
}

Sprite:
Java:
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;

import javax.imageio.ImageIO;

public class Sprite {

	long delay;
	long animation = 0;
	int currentPic = 0;
	BufferedImage[] pics;
	BufferedImage[] aa;
	
	private int x,y;
	
	public Sprite(String path, int x, int y, long delay, int count) {
		this.setX(x);
		this.setY(y);
		this.delay = delay;
		currentPic = 0;
		aa = loadPics(path, 4);
		this.setPics(aa);
	}
	
	public void setPics(BufferedImage[] pics) {
		this.pics = pics;
	}
	
	public void draw(Graphics g) {
		g.drawImage(pics[currentPic], this.x, this.y, null);
	}
	
	public void setX(int x) {
		this.x = x;
	}
	
	public void setY(int y) {
		this.y = y;
	}
		
	public void forceAnimation() {
		currentPic++;
		if (currentPic > pics.length-1) {
			currentPic = 0;
		}
	}
	
	public void checkNextPic(long delta) {
		animation += (delta/1000000);
		if (animation > delay)
		{
			animation = 0;
			forceAnimation();
		}
	}
	
	private BufferedImage[] loadPics(String path, int pics) {
		BufferedImage[] anim = new BufferedImage[pics];
		BufferedImage source = null;
		
		URL url = getClass().getClassLoader().getResource(path);
		try {
		source = ImageIO.read(url);
		} catch (IOException e) { }
		
		for (int x = 0; x < pics; x++) {
			anim[x] = source.getSubimage(x*source.getWidth()/pics, 0,                 //x1, y1
					                     source.getWidth()/pics, source.getHeight()); //x2, y2
		}
		
		return anim;
	}
}

Lässt sich bei mir kompilieren, und die Bilder werden auch nach einander gemalt, jedoch kommt es manchmal zu Bildstörungen zur Laufzet, liegt wahrscheinlich an der NPE.

Blöde Spriteklasse :p
 
P

peebles

Gast
Hi nochmal,

nach einem erneuten stack trace kam heraus, dass "pics" und "aa" null sind, was ich aber nicht ganz verstehe. Vielleicht kann mir dazu jemand meinen Fehler aufzeigen.

Gelöst habe ich es dann erst einmal grob und unschön so:
Java:
@Override
public void paintComponent(Graphics g) {
	super.paintComponent(g);
	
	BufferedImage[] u;
	u = sprite.loadPics("pics/Sprite1.png", 4);
	sprite.setPics(u);
	
	sprite.draw(g);
}

und mein Sprite-Konstruktor sind so aus:
Java:
public Sprite(String path, int x, int y, long delay, int count) {
	this.setX(x);
	this.setY(y);
	this.delay = delay;
	currentPic = 0;
}
"path" und "count einfach nicht beachten, sind nun unwichtig.
Also: Davor hatte ich im Konstruktor einem BufferedImage[] Array mit loadPics(...) ein gültiges Array zugewiesen, und dieses dann mit setPics() an ein neues Array "pics" übergeben. Beide sind doch somit initialisiert, oder?
In meiner draw() Methode hat sich nichts geändert, ich zeichne immernoch das Array this.pics mit dem Inhalt von "pics".

Jetzt habe ich den Zuweisungskram nicht mehr im Konstruktor, sondern direkt vor dem eigentlichen Zeichnen.

Bestimmt ist das ein blöder Fehler, bitte aber um Erklärung.
Danke
 
P

peebles

Gast
Hi nochmal,

konnte den Fehler nun entgültig identifizieren!

Java:
BufferedImage[] getPics()

Den eigenlichen Methodenaufruf musste ich noch auf null prüfen, obwohl eigentlich schon alles gültig initialisiert wurde.
 
S

SlaterB

Gast
in paintComponent (so spät und ständig wiederholt) solltest du keine Bilder von der Festplatte laden
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B 2D-Grafik paintcomponent Probleme beim zeichnen AWT, Swing, JavaFX & SWT 10
S AWT Probleme beim Zeichnen AWT, Swing, JavaFX & SWT 3
K Probleme beim zeichnen mit paintComponent() AWT, Swing, JavaFX & SWT 1
7 JavaFX Problem beim Zeichnen eines Dreiecks in einem GUI AWT, Swing, JavaFX & SWT 6
H JavaFX Freezes beim Zeichnen mit Canvas AWT, Swing, JavaFX & SWT 3
T Problem beim Zeichnen von Rechteck AWT, Swing, JavaFX & SWT 3
bluerob Problem beim Image zeichnen via andere Klasse AWT, Swing, JavaFX & SWT 7
M Swing Warum öffnen sich beim Zeichnen mit Swing plötzlich zwei Fenster? AWT, Swing, JavaFX & SWT 5
N 2D-Grafik 2 Probleme beim zeichnen AWT, Swing, JavaFX & SWT 18
K Swing Problem beim Zeichnen von Kreisen AWT, Swing, JavaFX & SWT 4
S Swing Laufzeitproblem beim Zeichnen AWT, Swing, JavaFX & SWT 7
K 2D-Grafik Linie verschwindet beim Zeichnen AWT, Swing, JavaFX & SWT 10
M Problem beim Zeichnen mit Path2D AWT, Swing, JavaFX & SWT 4
O Probleme beim Zeichnen und AWT-Event-Queue-0 Exception AWT, Swing, JavaFX & SWT 5
R Probleme beim Zeichnen eines Koordinatensystems AWT, Swing, JavaFX & SWT 10
Developer_X Swing Perfomance beim zeichnen und translaten AWT, Swing, JavaFX & SWT 2
G Performance beim Zeichnen erhöhen? AWT, Swing, JavaFX & SWT 21
hdi Aliasing-Effekte? (Blinken beim schnellem Zeichnen) AWT, Swing, JavaFX & SWT 36
N Zu hoher Speicherverbrauch beim Zeichnen (Canvas) AWT, Swing, JavaFX & SWT 5
K Verdchiebung beim Zeichnen AWT, Swing, JavaFX & SWT 3
P Problem beim Zeichnen auf ein BufferedImage AWT, Swing, JavaFX & SWT 4
M eine zeichnen beim mouse ziehen AWT, Swing, JavaFX & SWT 8
S Thread.sleep() beim Zeichnen auf Swing Komponenten? AWT, Swing, JavaFX & SWT 6
L Überlappungsproblem beim Zeichnen mit Paint() AWT, Swing, JavaFX & SWT 4
MartinNeuerlich Kann mir jemand, der einen Mac mit einem m1 oder m2-Chip hat, eine POM geben mit der Javafx-Fullscreen beim Mac mit m-Chip funktioniert? AWT, Swing, JavaFX & SWT 1
berserkerdq2 Wie greife ich auf ein Element zu, welches ich beim Scenebuilder erstellt habe AWT, Swing, JavaFX & SWT 10
H AWT Dialog Größe ändern - Schwarzer Inhalt beim groß ziehen AWT, Swing, JavaFX & SWT 1
L jComboBox Actionlistener wird beim erstmaligen Befüllen getriggert AWT, Swing, JavaFX & SWT 7
B Output GUI funktioniert nur beim ersten Mal richtig. AWT, Swing, JavaFX & SWT 4
A JavaFX exportierte Jar ohne beim starten die Libs hinzufügen? AWT, Swing, JavaFX & SWT 2
TheWhiteShadow JavaFX ListView Problem beim Entfernen von Elementen AWT, Swing, JavaFX & SWT 1
S Fehler beim Öffnen weiterer FXML AWT, Swing, JavaFX & SWT 11
I Probleme beim Drucken auf einen PDF-Drucker AWT, Swing, JavaFX & SWT 8
G Gui updated beim zweiten Aufruf nicht mehr AWT, Swing, JavaFX & SWT 15
K JavaFX Resizing-Problem beim BorderLayout (Center Component) beim Arbeiten mit mehreren FXMLs AWT, Swing, JavaFX & SWT 2
W Nullpointer Exception beim übertragen von Daten von Scene zu Scene AWT, Swing, JavaFX & SWT 6
missy72 JavaFX Wiederholen einer IF-Abfrage beim erneuten Öffnen einer Stage AWT, Swing, JavaFX & SWT 11
D JavaFX Probleme beim nachtäglichen hinzufügen der jfx dependency AWT, Swing, JavaFX & SWT 7
R NullPointerException beim Start des Fensters AWT, Swing, JavaFX & SWT 1
D JavaFX Label flackert beim aktualisieren AWT, Swing, JavaFX & SWT 12
J Kann mir jemand beim MediaPlayer helfen ? AWT, Swing, JavaFX & SWT 2
S JavaFx Zufallsfarbe beim Button-Klick AWT, Swing, JavaFX & SWT 22
L Swing JDialog ton beim klicken ausstellen AWT, Swing, JavaFX & SWT 1
sascha-sphw JavaFX ListCell höhe verändert sich beim ändern der Text-Farbe AWT, Swing, JavaFX & SWT 14
H Beim JFrame erstellen ein anderes schließen AWT, Swing, JavaFX & SWT 0
L Swing JLabel wird beim ändern der Schriftart immer neu gezeichnet. AWT, Swing, JavaFX & SWT 2
M AWT Kann meinen Fehler beim ActionListener nicht finden AWT, Swing, JavaFX & SWT 5
R 2D-Grafik Massive Frame Drops beim Benutzen von AffineTransformOp AWT, Swing, JavaFX & SWT 2
ruutaiokwu Swing windowStateChanged macht exakt das Gegenteil beim Verändern der Fenstergrösse AWT, Swing, JavaFX & SWT 3
J Exception beim JFrame erstellen AWT, Swing, JavaFX & SWT 6
D JInternalFrame wechselt Position beim ersten Click AWT, Swing, JavaFX & SWT 0
steven789hjk543 Swing Verstehe etwas beim GUI nicht AWT, Swing, JavaFX & SWT 3
L JavaFX Probleme beim Installieren JavaFX11 / JavaFX12 -- Eclipse 2019-03 AWT, Swing, JavaFX & SWT 3
H JavaFX Probleme Beim Wechseln der scene als .fxml AWT, Swing, JavaFX & SWT 7
A Fehler beim Hintergrund AWT, Swing, JavaFX & SWT 17
F JavaFX Probleme beim automatischen Konvertieren AWT, Swing, JavaFX & SWT 4
J Hilfe beim tablevies AWT, Swing, JavaFX & SWT 2
L JavaFX Fehler beim setzen von Farben AWT, Swing, JavaFX & SWT 16
T LookAndFeel LookAndFeel funktioniert nicht beim JFrame wechsel AWT, Swing, JavaFX & SWT 3
L Java FX Exception beim start AWT, Swing, JavaFX & SWT 2
L JSplitPane Divider Location beim Maximieren AWT, Swing, JavaFX & SWT 6
L JavaFX Problem beim Aufrufen einer Methode AWT, Swing, JavaFX & SWT 5
J ObservableList wirft exception beim zweiten füllen. AWT, Swing, JavaFX & SWT 4
emma_louisa JavaFX Werte beim Aufrufen des Fensters übernehmen (SceneBuilder) AWT, Swing, JavaFX & SWT 3
Tronert JavaFX Fehler beim Ändern der font-weight AWT, Swing, JavaFX & SWT 7
W Swing Hilfe beim Einbinden von Bildern in einem JFrame AWT, Swing, JavaFX & SWT 8
D Kein Icon beim JTabbedPane AWT, Swing, JavaFX & SWT 1
L JavaFX LoadException beim Laden von JavaFX Anwendung AWT, Swing, JavaFX & SWT 6
T Java FX Probleme beim befüllen eines Tableviews AWT, Swing, JavaFX & SWT 5
N Eclipse - GUI - MacBook - Buttonsichtbarkeit beim Anlegen/Erstellen AWT, Swing, JavaFX & SWT 14
T JButton wird beim vergrößern des Fensters erst sichtbar AWT, Swing, JavaFX & SWT 4
Tommy135 JavaFX JavaFX Fehler beim Scenewechsel AWT, Swing, JavaFX & SWT 23
E Swing Miserable Performance beim Ändern der Hintergrundfarbe von JLabels AWT, Swing, JavaFX & SWT 3
L Charset beim Drucken falsch AWT, Swing, JavaFX & SWT 2
MaxG. Swing Farbe von Button beim drücken ändern AWT, Swing, JavaFX & SWT 4
H JavaFX Kriege fehler beim Fenster wechseln AWT, Swing, JavaFX & SWT 7
D Swing Swing Objekte sehen im Entwurf anders aus als beim Ausführen AWT, Swing, JavaFX & SWT 3
R Swing Programm läuft nur beim Debuggen korrekt ab AWT, Swing, JavaFX & SWT 4
I 2D-Grafik Problem beim Ändern der Farbe eine 2d Objekts AWT, Swing, JavaFX & SWT 3
K Probleme beim JPasswordField AWT, Swing, JavaFX & SWT 11
W Kodierung (CharSet) beim Schreiben ändern AWT, Swing, JavaFX & SWT 1
D Swing JComboBox (DefaultComboBoxModel) überschreibt Eintrag beim erstellen AWT, Swing, JavaFX & SWT 0
T JButton überlagern sich und werden erst beim Mausscrollen sichtbar AWT, Swing, JavaFX & SWT 2
Thallius Swing "..." beim JLabel verhindern? AWT, Swing, JavaFX & SWT 3
P Scrollbalken verschwinden beim Zoomen AWT, Swing, JavaFX & SWT 4
A JavaFX DatePicker in Swing beim Start nicht sichtbar AWT, Swing, JavaFX & SWT 2
D JavaFX Probleme bei Service-Klasse beim ändern der GUI AWT, Swing, JavaFX & SWT 8
D JavaFX (WebStart) Graues Fenster beim Start AWT, Swing, JavaFX & SWT 4
O Swing JList beim Klicken in der GUI erstellen AWT, Swing, JavaFX & SWT 6
D Frame beim starten eines anderen Frames schließen AWT, Swing, JavaFX & SWT 2
R Hilfe beim ändern des Hintergrundes eines JFrames AWT, Swing, JavaFX & SWT 9
L JavaFX Verzögerung beim Laden von Daten AWT, Swing, JavaFX & SWT 6
S NullPointer Exception beim Laden von Bildern AWT, Swing, JavaFX & SWT 11
I JavaFX Speichern der eingefügten Einträge beim Neustart des Programms AWT, Swing, JavaFX & SWT 2
J JavaFx/SceneBuilder/Felder beim verlassen prüfen AWT, Swing, JavaFX & SWT 1
D JavaFX Beim Schließen (Rotes X) Code ausführen AWT, Swing, JavaFX & SWT 1
N Swing Problem beim Scrollen mit JScrollPane AWT, Swing, JavaFX & SWT 6
C Gesucht: Hilfe beim programmieren. AWT, Swing, JavaFX & SWT 1
S Action durchführen beim Programm beenden AWT, Swing, JavaFX & SWT 3
J JavaFX Tooltip Verzögerung beim ersten Anzeigen AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben