Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

30.04.2013, 14:33

Java Spiel Threads

Hallo zusammen,

ich wollte ein Spiel in Java entwickeln und habe nun ein Problem mit den Threads ^.^
Zuerst lief es folgender maßen in meinem Code:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public Window extends JPanel implements Runnable
{ 
 ...  
       public void init(){
          running = true;
          new Thread(this).start();
       }
       public void run(){
       ... 
            while(running) 
           { 
                repaint();
           }
       }
       paint(Graphics g){...}
}

bis hierhin läuft alles ohne Probleme...
nun wollte ich aber die Game loop auslagern d.h. ich habe nun "Window extends JPanel" und "Game implements runnable"
game erzeugt nun im Konstruktor :

C-/C++-Quelltext

1
Window gui = new Window();

und enthält natürlich:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
 public void run(){
       ... 
            while(running) 
           { 
                gui.repaint();
                System.out.println(UPS);
           }
       }

kommentiere ich gui.repaint(); aus wird das Fenster erstellt und ich kriege in der konsole die UPS angezeigt ... sobald ich nun gui.repaint() aufrufe kriege ich einen

C-/C++-Quelltext

1
2
3
Exception in thread "Thread-0" java.lang.NullPointerException
    at Game.run(Game.java:68)
    at java.lang.Thread.run(Unknown Source)


wiso klappt es wenn ich es in eine klasse packe aber sobald ich es aufteile gehts nicht mehr ? >.<

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

2

30.04.2013, 16:14

du versuchst auf irgendein Objekt zuzugreifen, welches nicht da ist, die entsprechende Variable also ein null enthält und kein Objekt. Ich würde darauf tippen, dass in deiner run()-Methode der Zugriff auf die Methode repaint() den Fehler verursacht, da sich hinter gui kein Objekt verbirgt.
Wenn du im Konstruktor tatsächlich Window gui = new Window(); aufrufst, dann bringt dir das so noch gar nichts, da du das erzeugte Objekt speichern musst. Du hast eine Variable im Konstruktor angelegt, die am Ende des Konstruktors verworfen wird. Wenn du in der run()-Methode darauf Zugriff haben willst, musst du einer Membervariable (this.gui?) das Objekt zuweisen.
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

3

30.04.2013, 18:17

Solche Fehler schreien übrigens schon nach dem Debugger;) Einfach mal versuchen das Ding zu benutzen. Je nach Entwicklungsumgebung wirst du dazu viele Informationen im Internet finden. Ansonsten steht das Forum auch immer gern für Fragen bereit.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

4

30.04.2013, 21:40

Nur mal so am Rande, repaint stellt ein Event in die AWT-Event-Queue ein, welches dann vom GUI Thread abgearbeitet wird. Das Einstellen von Events durch einen anderen Thread ist zwar schön und gut, aber sei vorsichtig wenn Du was anderes in diesem Thread mit Deinen GUI Elementen anstellst. Wenn Du eine Gameloop inkl. Grafik mit Java bauen willst, solltest Du lieber anders vorgehen. Einen Einstieg bietet Dir vielleicht dieser Artikel: http://content.gpwiki.org/index.php/Java…ouble_Buffering
Letztlich wird es immer schwer sein mit Swing oder AWT flüssige Spielgrafik hinzubekommen, sei also gewarnt. Wenn Du es flüssiger haben willst solltest Du Dir Slick2D, libGDX oder so anschauen.

5

30.04.2013, 23:29

bin es mit dem Debugger durchgegangen, hatte init() aufgerufen bevor ich Window gui initialisiert habe, damit wäre das Problem gelöst!
Vielen Dank für die Hilfe :D

Werbeanzeige