Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Frage zur Steuerung des Spielflusses

0 views
Skip to first unread message

Thomas Pawlitzki

unread,
Nov 14, 2003, 4:37:29 PM11/14/03
to
Hallo NG,

ich habe immer noch ein Problem mit der Steuerung des Spielflusses.
Ich habe folgende Klassen :

Klassen in dem Package GUI
http://mitglied.lycos.de/bolbit/UML/de_TWOmas_jtankbattle_GUI_classes.gif

Klassen in dem Package objects
http://mitglied.lycos.de/bolbit/UML/de_TWOmas_jtankbattle_objects_classes.gi
f

und die GameManager Klasse, um die es eigentilch geht, ist in dem Packet
manager
http://mitglied.lycos.de/bolbit/UML/de_TWOmas_jtankbattle_manager_classes.gi
f


Hier der Links zu dem bisherigen Ergebniss:
http://mitglied.lycos.de/bolbit/UML/JTankBattle.jar

Nochmal kurz zu dem Spielprinzip.

Es gibt mehrere Kononentürme auf einer Gebirgslandschaft.
In jeder Runde schiesst jeder 1 x nach.
Habe es jetzt mal so gemacht, dass das Spiel nach 10 Runden endet, da ich
noch ein Punktesystem einführen will.
Also müsste jeder 10 Schüsse haben.

Ich hatte es zuerst so gedacht, dass ich den GameFrame, der die ganze
Animation übernimmt, in einem Thread starte und den GameManager in einem
anderen.

Der GameManager erbt also von Thread und wird im Konstruktor mit
start()
direkt gestartet.

Die run() Methode sieht folgendermassen aus:
----------------------------------------------------------------------------
-------------------------------
public void run() {

for (int i = 1 ; i <= 10 ; i++) {

gf.setTitle("JTankBattle - Runde "+i);

Enumeration playerEnum = players.elements();
while (playerEnum.hasMoreElements()) {
Player p = (Player)playerEnum.nextElement();
gf.setGameControlPanel(p.getTank());
System.out.println("Player "+p.getName()+" aktiv");

try {
wait();
}
catch (InterruptedException ie) {
// DO NOTHING
}
}
}
}
----------------------------------------------------------------------------
-------------------------------

Der GameFrame (extends JFrame) soll nun auch in einem Thread ablaufen und
wird deswegen im Konstruktor folgendermassen gestartet:
----------------------------------------------------------------------------
-------------------------------
public GameFrame(int width, int heigth, GameManager gm) {
super("JTankBattle - GameFrame");

this.gm = gm;
/*
....................
*/

pack();
show();
repaint();

th = new Thread(this);
th.start();

}
----------------------------------------------------------------------------
-------------------------------

Die Run Methode sieht folgendermassen aus
----------------------------------------------------------------------------
-------------------------------
/** Run Methode
* aktualisiert den Bildschirm
* @see java.lang.Runnable#run()
*/
public void run() {

while (true) {

repaint();

try {
Thread.sleep(20);
}
catch(InterruptedException ie) {
// DO NOTHING
}

}
}
----------------------------------------------------------------------------
-------------------------------


Beim Start kriege ich nun aber folgende Exception
java.lang.IllegalMonitorStateException: current thread not owner

at java.lang.Object.wait(Native Method)

at java.lang.Object.wait(Object.java:429)

at de.TWOmas.jtankbattle.manager.GameManager.run(GameManager.java:92)

was diesem Ausdruck entspricht

try {
wait();
}
catch (InterruptedException ie) {
// DO NOTHING
}

Also irgendwo habe ich einen gewaltigen Denkfehler, finde ihn aber nicht :-(
Wer kann mir da auf die Sprünge helfen?

BTW: Habt ihr noch anregungen, was das Klassen/Objekt Design angeht?

Vielen Dank

--
Gruß Thomas

"Dumm ist der, der Dummes tut." (Forest Gump)

Jochen Theodorou

unread,
Nov 15, 2003, 2:30:05 PM11/15/03
to
Thomas Pawlitzki schrieb:
> Hallo NG,
>
[...]

> Ich hatte es zuerst so gedacht, dass ich den GameFrame, der die ganze
> Animation übernimmt, in einem Thread starte und den GameManager in einem
> anderen.

Die übliche Methode ist einen Animationsthread zu haben, der die
Darstellung veranlasst das mommentane Bild zu zeichenen.

> Der GameManager erbt also von Thread und wird im Konstruktor mit
> start()
> direkt gestartet.

Warum sollte der GameManager denn ein Thread sein? Reicht es denn nciht
wenn dieser im Thread "Main" läuft?

[...]


> try {
> wait();
> }
> catch (InterruptedException ie) {
> // DO NOTHING
> }

[...]

Auch wenn nicht mit einem Fehler zu rechnen ist lohnt es sich manchmal
doch die Exception auszugeben. Ich mache das Grundsätzlich.

> Der GameFrame (extends JFrame) soll nun auch in einem Thread ablaufen

Warum? AWT und damit auch Swing hat schon einen eigenen Thread. Das ist
imho unnötig und bringt vielleicht sogar Probleme.

[...]


> Beim Start kriege ich nun aber folgende Exception
> java.lang.IllegalMonitorStateException: current thread not owner
>
> at java.lang.Object.wait(Native Method)
> at java.lang.Object.wait(Object.java:429)
> at de.TWOmas.jtankbattle.manager.GameManager.run(GameManager.java:92)
>
> was diesem Ausdruck entspricht
>
> try {
> wait();
> }
> catch (InterruptedException ie) {
> // DO NOTHING
> }
>
> Also irgendwo habe ich einen gewaltigen Denkfehler, finde ihn aber nicht :-(
> Wer kann mir da auf die Sprünge helfen?

Ich gebe dir einen Tipp (ich hasse die neue Rechtschreibung...)
Wo ist hier ein synchronized?

> BTW: Habt ihr noch anregungen, was das Klassen/Objekt Design angeht?

Ja...

Wenn du schon die wait-notify-Technik anwendest, dann bitte auch
durchgehend. Auch wait kann man eine Maximale Wartezeit mitgeben.

Ich würde den Animator lieber als Extrathread machen... meinetwegen als
innere Klasse des Frames.

Bei mir sieht ein Animator eigentlich so aus:
- Zeitmessung starten
- Spielzustand erfragen
- In Buffer Zeichnen.
- Buffer wechseln
- Zeitmessung beenden
- Restzeit abwarten und zum Anfang.

Der Frame selbst ist bei mir sehr dumm und dient nur der Anzeige des
momentanen Buffers.
.. Aber das ist vielleicht auch Geschmackssache. Und da dein Schuss sich
scheinbar auch selbst zeichnet bringt das bei dir nichts, es sei denn
man stellt den Code komplett um.

Gruss theo

Thomas Pawlitzki

unread,
Nov 15, 2003, 5:46:43 PM11/15/03
to
Erstaml Danke für deine Anregungen.

Werde mir wohl mal noch ein wenig Gedanken machen müssen.

Mit dem Synconized war ein guter Tipp.

Und das Mit dem Animator auch.

Habe jetzt einen Animator gemacht, in den ich alle Objekte reinschreibe, die
Gezeichnet werden sollen.

Die Animtor.paint(Graphics g) wird aus dem GameFrame aufgerufen und zeichnet
dann alle Objekte.

Mal sehen, ob ich damit weiterkomme.

0 new messages