Thread und jpanel-paintcomponent kombinierbar??

Stormblade

Mitglied
Hallihallo,

ich bin seit einigen Tagen dabei Super-Mario zu programmieren. Mit einiger Hilfe aus dem Forum hier bin ich schon relativ weit gekommen, doch langsam komme ich zu dem Punkt, da ich einsehen muss, dass die performance sehr leidet wenn ich mehr und mehr objekte berechnen lasse.

Ich dachte mir, dass ich die Performance wieder erhöhen kann indem ich einzelne Objekte, wie zum beispiel mario und gumbas, sowie schildkröten und feuerbälle als einzelne Threads laufen lassen könnte.
Doch irgendwie ist das ganze nicht so einfach wie ich dachte. Wenn ich den zeichenvorgang meiner Objekte von der paintComponent-methode, in die jeweilige Thread-Klasse verschieben möchte, dann seh ich auf meinem schirm nix mehr, da das Graphics g nicht so leicht übergebbar is oder so.
Also frage ich, ob ich trotzdem meine Objekte als Thread haben kann, oder ob das einfach nicht funktioniert???
 

TKausL

Top Contributor
Hallo.

Für jeden Entity einen eigenen Thread schreiben ist nicht sehr sinnvoll, bringt nur Probleme.
Vieleicht zeigst du uns einfach mal so deine Main-Schleife welche updated und rendert.
 

Stormblade

Mitglied
Hm, ok, also ich hab meine Klasse GamePanel:
Java:
public class GamePanel extends JPanel{

  Entity mario, gumba, schildkröte;
  MotionSimulator motion;

  public GamePanel(){
    super();
    mario = new Entity();
    gumba = new Entity();
    schildkröte = new Entity();
  }

  public void paintComponent(){
    super.paintComponent();
    mario.drawEntity(g);
    Thread.sleep(50);             //in echt mit try und catch ausgeschrieben...
    repaint();
}
Und hier meine Entity-Klasse:
Java:
public class Entity{
  int x, y, z;
  Graphics g;
  MotionSimulator motion = new MotionSimulator();
  Umgebungsscanner scanner = new Umgebungsscanner();

  public void drawEntity(Graphics g){
    scanner.scanEnvironment();
    motion.forHumanPlayer();
    scanner.setPosition(motion.getx(), motion.gety(), motion.getvy())   // die werden im scanner verrechnet
    g.drawImage(img, motion.getx(), motion.gety(), 50, 50, null);
  }
}

Sodele, das is jetz nur auf die schnelle eine sehr sehr abgespeckte version meines programmes. Graphics g wird hier vom GamePanel aus an die Entity-Klasse übergeben, das funktioniert soweit. Doch ich habe es noch nicht geschafft, die Entity-klasse in einen Thread umzubauen, der dann funktionieren würde...
 

TKausL

Top Contributor
Java:
public void paintComponent()

Was ist das? Wenn du die Klasse überschreiben willst musst du natürlich auch das Graphics annehmen mit dem du dann arbeitest.

Per Thread kannst du ja dann repaint() aufrufen.
 

Stormblade

Mitglied
ups, das mit dem (Graphics g) hatte ich beim schreiben dieses themas vergessen ;D In meinem Programm isses natürlich drin. Ich versuch jetzt einfach mal ohne Threads weiter zu machen, das erspart mir einiges umdenken :D
 

Marco13

Top Contributor
Falls das eine "abgespeckte" :autsch: Version der "echten" paintComponent war: Darin sollte man NICHT sleep und NICHT repaint aufrufen!!!
 

Stormblade

Mitglied
Lol, kein repaint() in der paintComponent??? Das mach ich schon immer so, wie sonst sollte ich veranlassen, dass das zeug neu gezeichnet wird??? Das haben mir hier schon leute empfohlen und funktioniert auch vorzüglich :D
 

Marco13

Top Contributor
Ja, es wird ein Haufen Unfug gepostet (und ich habe das Gefühl, dass es mehr wird). Repaint in der paintComponent aufzurufen, ist
[SPOILER="Klicke den Button, wo 'Weiterlesen' drauf steht]Klicke den Button, wo 'Schließen' drauf steht[/SPOILER]
 

Stormblade

Mitglied
immer eure kurzen antworten :D :D "im controller des spiels" heißt für mich jetzt, dass ich in der main-methode in meiner Hauptklasse ne whileschleife habe, in der drinsteht: GamePanel.paintComponent.repaint();
Habe ich das richtig interpretiert?
 

Marco13

Top Contributor
Ja, in etwa. Üblicherweise gibt es in so einem ("einfachen") Spiel mindestens einen "Game Thread", der sich um den allgemeinen Spielablauf kümmert, wie z.B. die Bewegung der Figuren. Die Bewegung der Figuren hängt dabei auch davon ab, wie lange ein "Schritt" in dem Spiel dauert. GANZ grob ist der Ablauf dabei sowas wie
Java:
long previousTime = System.nanoTime();
while (!gameFinished)
{
    long currentTime = System.nanoTime();
    long passedTime = currentTime - previousTime;
    moveObjectsAccordingTo(passedTime);
    gui.repaint(); <- Da isses
    // Evtl.
    Thread.sleep(aFewMs); 
}
Schau auch mal in http://www.java-forum.org/spiele-multimedia-programmierung/54795-quaxli-2d-spiele-tutorial.html
 

Empire Phoenix

Top Contributor
Und aFewMs wüde sich aus zb 50ms - passedTime ergeben, wenn man will das die logic das spiels fest in 50ms schritten abläuft, egal wie schnell oder langsam der pc. Und egal wie lange die berechnungen brauchen (ausnahme wenn langsamer als 50ms)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N JPanel Inhalt aktualisiert nach Thread.sleep nicht Spiele- und Multimedia-Programmierung 2
G Minecraft PlayerBot (Listener Thread für jeden Spieler?) Spiele- und Multimedia-Programmierung 3
H Exeption in thread "Thread-2" NullPointerExeption: init methode? Spiele- und Multimedia-Programmierung 25
O Thread pausieren und wieder starten Spiele- und Multimedia-Programmierung 2
kaoZ Animation in eigenen Thread auslagern..... Spiele- und Multimedia-Programmierung 1
gamebreiti Daemon Thread Spiele- und Multimedia-Programmierung 4
M Point & Click Thread Probleme Spiele- und Multimedia-Programmierung 20
Kenan89 Alternative zu Thread Runnable Spiele- und Multimedia-Programmierung 2
O Universe <- show Thread Spiele- und Multimedia-Programmierung 14
Y Warum Thread für Spieleprogrammierung? Spiele- und Multimedia-Programmierung 27
C ***** bitte thread löschen *** Spiele- und Multimedia-Programmierung 3
A KeyListener - Thread Problem Spiele- und Multimedia-Programmierung 2
D Snake n+1-Thread Spiele- und Multimedia-Programmierung 2
B Applet startet, aber führt den Thread nicht aus Spiele- und Multimedia-Programmierung 7
S Ein Thread für alle Animationen oder mehrere? Spiele- und Multimedia-Programmierung 2
G Thread startet nicht im Vollbild modus Spiele- und Multimedia-Programmierung 3
E TetrisApplet Thread Hilfe Spiele- und Multimedia-Programmierung 6
Developer_X Thread in Java3D Spiele- und Multimedia-Programmierung 8
D Methode in eigenem Thread auslagern Spiele- und Multimedia-Programmierung 9
S Probleme mit Thread beim Streaming Spiele- und Multimedia-Programmierung 1
F Problem mit Thread.sleep() Spiele- und Multimedia-Programmierung 7
Tapsi Thread wartet auf Threads Spiele- und Multimedia-Programmierung 7
M Thread.sleep() problem Spiele- und Multimedia-Programmierung 10
0 Workaround für Thread.sleep()-Bug Spiele- und Multimedia-Programmierung 15
M Roundbased - Thread anhalten Spiele- und Multimedia-Programmierung 8
D Wasserstrahl animieren: ein Thread je Tropfen? Spiele- und Multimedia-Programmierung 7
S Thread unterbrechen Spiele- und Multimedia-Programmierung 3
R JPanel wird erst im Fullscreen angezeigt Spiele- und Multimedia-Programmierung 1
P selectedItem aus einem Methodenerstellten JPanel auslesen. Spiele- und Multimedia-Programmierung 5
M JPanel mit Graphics2D Objekten mit JScrollpane Spiele- und Multimedia-Programmierung 6
K JPanel wechseln & Neu starten - SnakeSpiel Spiele- und Multimedia-Programmierung 2
A paintComponent in JPanel in JFrame Spiele- und Multimedia-Programmierung 7
E Animiertes JPanel dynamisch wechseln Spiele- und Multimedia-Programmierung 3
W Panel/JPAnel createImage() Exception Spiele- und Multimedia-Programmierung 2
R Probleme mit JPanel!KeyListener geht nicht Spiele- und Multimedia-Programmierung 6
T Problem bei LinkedList / JPanel Spiele- und Multimedia-Programmierung 4
C 2D Sprites an die JPanel Größe (Auflösung) anpassen/skalieren Spiele- und Multimedia-Programmierung 3
F Vektorgrafik in JPanel Spiele- und Multimedia-Programmierung 5
E Active Rendering im FSEM auf ein JPanel? Spiele- und Multimedia-Programmierung 4
L 2D-Spiele ruckeln auf JPanel Spiele- und Multimedia-Programmierung 7
A Mehrere geometrische Objekte in JPanel zeichnen Spiele- und Multimedia-Programmierung 4
X JPanel dynamisch (Koordinatensystem)? Spiele- und Multimedia-Programmierung 30
M Jpanel Graphik speichern Spiele- und Multimedia-Programmierung 6
DamienX Canvas vs JPanel Spiele- und Multimedia-Programmierung 15
S Problem mit JPanel bzw p a i n t Spiele- und Multimedia-Programmierung 6
K stringWidth bei Graphics von JPanel und Printer unterschiedl Spiele- und Multimedia-Programmierung 4
R SimpleUniverse in JPanel Spiele- und Multimedia-Programmierung 4
M 1. Menüleiste wird doppelt gezeichnet 2. awt auf ein jpanel Spiele- und Multimedia-Programmierung 4
M Jpanel mit Keylistener Spiele- und Multimedia-Programmierung 6
D 2D Graphic Objekte in ein JPanel einfügen Spiele- und Multimedia-Programmierung 2
B paintComponent Methode Spiele- und Multimedia-Programmierung 4
GRAZZ0R "PaintComponent" und "MouseListener" einbinden Spiele- und Multimedia-Programmierung 4
S PaintComponent zeichnet in falscher reihenfolge Spiele- und Multimedia-Programmierung 8
R BufferStrategy vs. paintComponent Spiele- und Multimedia-Programmierung 9
W JOGL bleibt nach display() in PaintArea.paintComponent hängen Spiele- und Multimedia-Programmierung 5
B paintComponent() , Parameter Spiele- und Multimedia-Programmierung 2

Ähnliche Java Themen

Neue Themen


Oben