Hallo zusammen,
ich studiere zur Zeit Informatik. Dort lernt man zwar relativ schnell all die technischen Feinheiten von Java, Swing wird allerdings etwas vernachlässigt. Ich möchte mich also selbst ein wenig schlauer auf dem Gebiet machen.
Deswegen habe ich mir eine Herausforderung gesetzt. Ich möchte eine kleine Adventure-Engine schreiben.
Nichts großartiges, man soll bloß Dinge nehmen und benutzen können.
Die Technik ist fertig und als Textadventure kann ich die Spiele ausgeben. Nun wollte ich das ganze mit Swing realisieren und werde langsam bekloppt.
Zur Programmstruktur:
Ich habe einen JFrame. Momentan ohne Layout. Er besteht aus:
- Einem JPanel. Hier wird die ganze Szenerie gemalt (Hintergrundbild + Objekte, die man benutzen oder nehmen kann).
- Einem JLabel. Es dient dazu, Gespräche darzustellen. Wenn ich also auf einen Schlüssel in der Szene mit Rechtsklick drücke steht dort für eine gewisse Zeit "Das ist ein Schlüssel" oder so etwas.
Das JPanel basiert nun auf einer Klasse Game, die alle Informationen über das Spiel sammelt. Zum Beispiel die aktuelle Szene. Eine Szene hat natürlich ein Hintergrundbild, dass auf den JPanel gezeichnet wird.
Ein größeres Problem ist es nun für mich, die einzelnen Szenerieobjekte darzustellen.
Ich wollte sie zunächst einfach über das Hintergrundbild malen. Das klappt aber nicht, weil diese Objekte ja anklickbar sein müssen. Also erzeuge ich für jedes Szenerieobjekt ein Objekt einer Klasse SceneryComponent mit der Größe des Bildes des Szenerieobjektes. Auf diese Komponente wird das Bild gezeichnet.
Das Bild wird nur bei der Erzeugung der Szene geladen und in eine Instanzvariable der SceneryComponent gespeichert, damit es beim neu zeichnen nicht jedes Mal neu geladen wird.
Nun funktioniert das ganze (und auch stabil). Wenn ich ein Objekt ansehe (also mit rechtsklick drauf klicke) startet nun der Thread für die Textausgabe. Dadurch wird das Bild neu gezeichnet, sodass es jedes mal, wenn ich auf ein Objekt klicke, flackert. Obwohl das Bild ja nicht neu geladen wird, sondern lediglich neu gezeichnet. Das neu-zeichnen ist ja in diesem Fall sogar überflüssig, weil am Bild ja nichts geändert wird.
Stimmt etwas grob an meiner Programmstruktur nicht oder muss ich nur genauer festlegen, wann Bilder neu gezeichnet werden sollen?
lg Toto
ich studiere zur Zeit Informatik. Dort lernt man zwar relativ schnell all die technischen Feinheiten von Java, Swing wird allerdings etwas vernachlässigt. Ich möchte mich also selbst ein wenig schlauer auf dem Gebiet machen.
Deswegen habe ich mir eine Herausforderung gesetzt. Ich möchte eine kleine Adventure-Engine schreiben.
Nichts großartiges, man soll bloß Dinge nehmen und benutzen können.
Die Technik ist fertig und als Textadventure kann ich die Spiele ausgeben. Nun wollte ich das ganze mit Swing realisieren und werde langsam bekloppt.
Zur Programmstruktur:
Ich habe einen JFrame. Momentan ohne Layout. Er besteht aus:
- Einem JPanel. Hier wird die ganze Szenerie gemalt (Hintergrundbild + Objekte, die man benutzen oder nehmen kann).
- Einem JLabel. Es dient dazu, Gespräche darzustellen. Wenn ich also auf einen Schlüssel in der Szene mit Rechtsklick drücke steht dort für eine gewisse Zeit "Das ist ein Schlüssel" oder so etwas.
Das JPanel basiert nun auf einer Klasse Game, die alle Informationen über das Spiel sammelt. Zum Beispiel die aktuelle Szene. Eine Szene hat natürlich ein Hintergrundbild, dass auf den JPanel gezeichnet wird.
Ein größeres Problem ist es nun für mich, die einzelnen Szenerieobjekte darzustellen.
Ich wollte sie zunächst einfach über das Hintergrundbild malen. Das klappt aber nicht, weil diese Objekte ja anklickbar sein müssen. Also erzeuge ich für jedes Szenerieobjekt ein Objekt einer Klasse SceneryComponent mit der Größe des Bildes des Szenerieobjektes. Auf diese Komponente wird das Bild gezeichnet.
Das Bild wird nur bei der Erzeugung der Szene geladen und in eine Instanzvariable der SceneryComponent gespeichert, damit es beim neu zeichnen nicht jedes Mal neu geladen wird.
Nun funktioniert das ganze (und auch stabil). Wenn ich ein Objekt ansehe (also mit rechtsklick drauf klicke) startet nun der Thread für die Textausgabe. Dadurch wird das Bild neu gezeichnet, sodass es jedes mal, wenn ich auf ein Objekt klicke, flackert. Obwohl das Bild ja nicht neu geladen wird, sondern lediglich neu gezeichnet. Das neu-zeichnen ist ja in diesem Fall sogar überflüssig, weil am Bild ja nichts geändert wird.
Stimmt etwas grob an meiner Programmstruktur nicht oder muss ich nur genauer festlegen, wann Bilder neu gezeichnet werden sollen?
lg Toto