# Java2D Spiel "JSlotter"



## angelchr (21. Jan 2008)

Hallo zusammen, 

ich arbeite momentan an einem Projekt, wie oben schon beschrieben nennt sich das Teil JSlotter. Das Spiel soll eine in Java2D gehaltene Applikation sein, die dem Spiel Slotter von MB nachempfunden ist. Nun habe ich eine Grundsätzliche Frage zu dem ganzen. Ich muss für das Spiel mehrere Sachen in Java2D zeichnen mit Circles usw. Nun zu meiner Frage:
Wie verhält sich das ganze mit Threads, wenn die Applikation auf einem JFrame und einem JPanel basiert?

Ich zeichne in einer Klasse die von JPanel erbt mehrere Kreise, die später durch threads animiert werden. Muss ich mich darum kümmern, dass alles in dem eventDispatchThread abläuft ja oder nein?
Wenn ja wie mache ich das? Hinweis: es muss auch gewährleistet sein, dass mehrere Animationen parallel laufen.

Gibt es einen Unterschied, ob ich auf einem JPanel zeichne, oder auf Canvas?

Worin liegt der unterschied ob ich paint(Graphics g) oder paintComponent(..) verwende?

Ich würde mich auf Antworten freuen und danke schon im voraus. 

Gruß

Angelchr


----------



## Marco13 (21. Jan 2008)

Hey, Slotter fand' ich ja immer total toll   

_Gibt es einen Unterschied, ob ich auf einem JPanel zeichne, oder auf Canvas?_
Ja, ein Canvas gehört zu AWT, ist Heavyweight und nicht double-buffered.
Verwende lieber Swing, d.h. ein JPanel oder einfach eine JComponent

_Worin liegt der unterschied ob ich paint(Graphics g) oder paintComponent(..) verwende? _
Bei AWT überschreibt man paint. Bei Swing überschreibt man paintComponent, weil "paint" dort (vereinfacht gesagt) noch mehr macht, als NUR den Inhalt der Component zu zeichnen.

_Wie verhält sich das ganze mit Threads, wenn die Applikation auf einem JFrame und einem JPanel basiert?

Ich zeichne in einer Klasse die von JPanel erbt mehrere Kreise, die später durch threads animiert werden. Muss ich mich darum kümmern, dass alles in dem eventDispatchThread abläuft ja oder nein?

Wenn ja wie mache ich das? Hinweis: es muss auch gewährleistet sein, dass mehrere Animationen parallel laufen.
_
Das Zeichnen selbst passiert NUR in der paintComponent-Methode. Und die wird autoamtisch immer vom Event-Dispatch-Thread aufgeführt. Wenn die Kreise sich bewegen und die "Münzen" fallen sollen, muss das von einem eigenen Thread gemacht werden. (Evtl. auch von mehreren, das ist aber vmtl. nicht nötig, und könnte unnötig kompliziert werden). Dieser Thread verändert dann nur die Positionen der Münzen, und ruft "repaint()" auf - so dass wenig später in paintComponent die Münze an der neuen Position gezeichnet wird.

Schau auf jeden Fall mal hier
http://java.sun.com/products/jfc/tsc/articles/painting/
und evtl. auch hier
http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html


----------



## angelchr (21. Jan 2008)

hey,

danke für die schnelle Antwort. Ich habe die Applikation schon implementiert.
Allerdings muss ich dir sagen ich brauche mehrere Threads. Wenn eine Münze vom letzten Rad in den Tresor fällt, dann will ich ermöglichen, dass gleich der nächste Spieler weitermachen kann. somit muss ich in einem Thread die münze animieren und in einem anderen die bewegung des Rades sicherstellen.

Aber wie um alles in der Welt kann ich herausfinden ob wirklich meine ganzen repaints im EventDispatch laufen? Ich bin mir da nämlich mal gar nicht sicher.

Wenn ich eine möglichkeit hätte, würd ich das teil ja mal komplett posten (ca 11.000 Zeilen), da ich mir auch ehrlich gesagt nicht sicher bin ob man das überhaupt so implementiert wie ich es gemacht habe.... es sind da einige Dinge die ich wenn ich wüsste wie anders machen würde.... 


Gruß
angelchr


----------



## Marco13 (21. Jan 2008)

OK, wenn du einen eigenen "Münzen-Fall"-Thread und einen eigenen "Dreh"-Thread hast, kann das sinnvoll sein .... man könnte es vmtl. auch irgendwie kombinieren (eben in einem Thread "falleEinStück()" und "dreheEinBißchen()" aufrufen), aber es spricht ja nichts dagegen, dafür 2 Threads zu machen.

Das _Aufrufen_ von 'repaint()' kann von jeder Stelle aus passieren. Zu jedem Zeitpunkt, und von jedem Thread aus. 'repaint()' legt einfach nur eine Nachricht in die Event-Queue: "Bitte neu zeichnen". Die Queue wird vom EventDispatchThread abgearbeitet, und der übernimmt dann auch das painten.


----------

