java: Parameterübergabe zu Graphic g Methoden (awt)

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Benutzeravatar
Terep
Beiträge: 53
Registriert: 17.01.2008, 21:20
Wohnort: Hannover Region

java: Parameterübergabe zu Graphic g Methoden (awt)

Beitrag von Terep »

Parameterübergabe zu Methoden, die Graphic g als Parameter verlangen

Hallo Leute

Nach einer guten Pause habe ich mich wieder dem Hobby Programmieren zugewendet. Jetzt mit java. Zurzeit will ich ein Brettspiel nach programmieren.
Die Spielfläche habe ich aus awt mittels der Methode public void paint (Graphics g) für mich zufriedenstellend zeichnen können.
Jetzt taucht ein Problem auf, mit dem ich nicht gerechnet habe.
Versuche ich, Daten aus anderen Objekten zu der Spielfläche zu übermitteln, scheitere ich daran, dass die Methode zwingend (Graphics g) als Übergabeparameter verlangt. Die ist in den anderen Objekten nicht da.
Wie kriege ich es hin, dass zum Beispiel die Information von Spieler eins „komme vom Feld 1, gehe auf das Feld 5“ übertrage.

Meine Lösungsansätze:
Die gesamte Spielschleife mit Spielerinfos in der Klasse Spielfläche entwickeln.
(Dann ist der Objektansatz aber hin).

Mit Listener Methoden arbeiten.
(Denke jedoch, diese sind für andere Problemstellungen gedacht, wie bei der GUI)

Datenaustausch mit der Zwischenablage
(Habe ich noch nicht gelesen, hört sich aber aufwendig an).

Zuerst dachte ich, es ist ein Trivialproblem. Aber dem ist nicht so. Zumindest für mich.

Es wäre schön, wenn hier jemand eine konkrete Hilfestellung geben könnte, in welche Richtung man das Problem löst.

Terep
Avatar = „Odyssee im Weltraum“ Film von Stanley Kubrick (Warner Brothers);
nach dem Buch von Arthur C. Clarke. It will becoming true ?!!
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4263
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: java: Parameterübergabe zu Graphic g Methoden (awt)

Beitrag von Chromanoid »

Ich verstehe noch nicht so richtig dein Problem. Du solltest deine Spielfläche vielleicht als JPanel basteln und dann eine JLabel Komponente hinzufügen, die je nach dem eben nichts oder deinen Text darstellt. So oder so ähnlich würde ich das wohl machen, wenn es mit Java-Komponenten umgesetzt werden soll. Ansonsten kannst du dir natürlich eine eigene Mal-Logik bauen und so eine Art Minikomponenten erstellen. Dann zum Beispiel Spielfeld, Spielfigur, Text etc. Diese werden dann in der Paint/updateGraphics Funktion von einem generellen Anzeigeobjekt nacheinander abgerufen...

Wenn du da mehr Arbeit reinstecken willst, kannst du dir auch mal http://libgdx.badlogicgames.com/ http://slick.cokeandcode.com/ oder http://lwjgl.org/ anschauen.
Virus
Beiträge: 38
Registriert: 20.09.2002, 17:28
Kontaktdaten:

Re: java: Parameterübergabe zu Graphic g Methoden (awt)

Beitrag von Virus »

Hi,

1. Dei Post ist für mich nicht verständlich. Meine unten stehende Antwort beruht daher auf Vermutungen. Vielleicht würden Teile deines Quellcodes helfen.
2. Ich kenne mich mit AWT nur sehr begrenzt aus.

Gut, ich probiers trotzdem mal. Ich nehme an, du malst dein Spielfeld auf einen AWT Frame oder ähnliches. Für diesen musst du eben die von dir genannte paint methode implementieren. Als Parameter bekommst du dazu eine Instanz der Klasse Graphics (das g). Diese Variable g kannst du eben nun nutzen, etwas zu malen - und das klappt ja wohl auch schon. Deswegen frage ich mich, was überhaupt dein Problem ist?

Du willst scheinbar noch mehr malen. Einen Spielstein z.B. Dann erstellst du dir eine Klasse Spielstein, etwa so:

Code: Alles auswählen

public class Spielstein {
  private x; // x position
  private y; // y position
  public void paint( Graphics g ) {
    // nutze g, um den Spielstein zu malen! Z.B.
    // g.setColor( Color.blue );
    // g.drawRect(x, y, x+10, y+10);
   }
}
In deiner Methode, wo dein Feld gemalt wird, rufst du dan einfach die Methode paint aller Spielsteine auf

Code: Alles auswählen

public class Spielfeld extends Frame {
  // ...
  private List<Spielstein> = new ArrayList<Spielstein>();
  // ...
  public void paint( Graphics g ) {
    // male feld
    // ...
    // male steine
    for (stein : spielSteine) {
      stein.paint(g);
    }
}
Wenn du irgendwann alles neuzeichen möchstest, kannst du einfach repaint() aufrufen (an einem Spielfeld-Objekt).

Hoffe das hilft dir. Ansonsten präsiziere deine Frage bitte.
Benutzeravatar
Terep
Beiträge: 53
Registriert: 17.01.2008, 21:20
Wohnort: Hannover Region

Re: java: Parameterübergabe zu Graphic g Methoden (awt)

Beitrag von Terep »

Hallo Chromaniod, hallo Virus

Die Spielfläche ist fertig gemalt.

Jetzt will ich die Figuren bewegen. Im Abgangsfeld male ich den Hintergrund neu, im Zugangsfeld male ich die Figur. So lasse ich alle Figuren entsprechend den Würfeln laufen.

Nur das Spielerobjekt muss pro Spielrunde die Daten in Form von Spieler x, vonFeld anFeld übertragen. Diese Übertragung geht eben nicht wie sonst, siehe oben.

Zur Zeit lese ich mich in das Event-Handling ein. Ich hatte auf eine schnelle einfache Lösung gehofft. Die gibt es wohl nicht.

Terep
Avatar = „Odyssee im Weltraum“ Film von Stanley Kubrick (Warner Brothers);
nach dem Buch von Arthur C. Clarke. It will becoming true ?!!
Virus
Beiträge: 38
Registriert: 20.09.2002, 17:28
Kontaktdaten:

Re: java: Parameterübergabe zu Graphic g Methoden (awt)

Beitrag von Virus »

Ich verstehe nicht, was an der Übertragung nicht "wie sonst" gehen soll. Wo auch immer gemalt werden soll, brauchst du eben alle nötigen Informationen. Z. B. müsstest du in der Klasse, in der gemalt wird, Referenzen auf alle Spieler haben und gut ist. Mal doch einfach alles neu, das ist doch am einfachsten (auch wenn es besser geht), dann musst du auch nicht beachten, woher die Figur kommt. Event-Handling hilft dir jedenfalls da auch nicht wirklich weiter. Eben, weil du halt schon wissen musst, was du malen willst (auch wenn mit Event-Handling evtl. eine schönere Struktur möglich ist).
Benutzeravatar
Terep
Beiträge: 53
Registriert: 17.01.2008, 21:20
Wohnort: Hannover Region

Re: java: Parameterübergabe zu Graphic g Methoden (awt)

Beitrag von Terep »

Noch einmal zur Klarstellung

Ich habe das Spielfeld komplett gemalt und es ist fertig.

Spielfiguren sollen sich je nach Würfelwurf um die Anzahl der Felder fortbewegen.
Dafür habe ich für jedes einzelne Feld, auf denen sich die Figuren bewegen, die Methode „maleSpielfigur auf dem anFeld und löscheSpielfigur indem der Hintergrund neu gemalt wird.
Das alles klappt ohne Probleme.

Jetzt will ich die Information, welcher Spieler vom Feld A auf Feld B geht, von außerhalb der Klasse Spielfeld übergeben. Ich übergebe zum Beispiel den Aufruf bewegeFigur (1,3,6);
In der Klasse Spielfeld kann ich die Parameter entsprechend setzen:
public void bewegeFigur ( spieler sp, int vonFeld, int anFeld)

Die Methode benötigt jedoch als Grafikmethode die Übergabe (Graphic g, spieler sp, int vonFeld, int anFeld )

Das Problem dabei ist, dass die Methoden, mit denen ich male, alle Graphic g als Parameter brauchen. Ohne diese Übergabe keine Grafik. Die anderen Klassen werden nicht aus Frame abgeleitet und haben deshalb keine Grafikmethoden und können daher Graphic g nicht übergeben.

Also habe ich das Problem, Informationen wie „Spieler eins geht von Feld 3 nach Feld 6“ aus den Objekten Spieler in die Grafikmethoden zu übergeben. Klingt trivial, aber scheint es nicht zu sein.

Terep
Avatar = „Odyssee im Weltraum“ Film von Stanley Kubrick (Warner Brothers);
nach dem Buch von Arthur C. Clarke. It will becoming true ?!!
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4263
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: java: Parameterübergabe zu Graphic g Methoden (awt)

Beitrag von Chromanoid »

Die java render pipeline ist eigentlich eher dazu gedacht nur zu malen wenn es nötig ist und zwar aufgerufen aus dem Swing thread. Am besten baust du aus deinem Spielfeld eine Java Komponente ähnlich einem Panel. Jedes Feld ist dann ebenfalls ein Panel und kann per repaint o.Ä. aktualisiert werden. Ansonsten solltest du das ganze eher so angehen: http://content.gpwiki.org/index.php/Jav ... _Buffering (besonders http://content.gpwiki.org/index.php/Jav ... _Example_2)
Benutzeravatar
Terep
Beiträge: 53
Registriert: 17.01.2008, 21:20
Wohnort: Hannover Region

Re: java: Parameterübergabe zu Graphic g Methoden (awt)

Beitrag von Terep »

Hallo Chromanoid

Die Links sehen ganz interessant aus.
Werde ich mir später ansehen. Für mein Brettspiel zu aufwendig.

Ich habe jetzt eine Lösung im Kopf. Die Daten werden nicht vom Spielerobjekt übergeben, sondern die Grafikmethode übergibt die Daten an das Spielerobjekt. Damit habe ich das Hindernis einfach ignoriert und auf später verschoben.

Zum Start werden die Anzahl der Spieler als Startwert an die Klasse Spielfeld übergeben. Hier werde ich eine einfache Endlosschleife in einer Grafikmethode installieren und auch würfeln lassen. Innerhalb dieser Schleife werden die Daten an eine entsprechende Methode die Spielerklasse gegeben. Dort werden dann die Spielalgorithmen abgearbeitet (hoffentlich).

Bei mehr eigenem Wissen, wird Buffering, also Deine genannten Links, ein Thema sein.
Zur Zeit muss ich erst einmal mein bisher angelesenes Wissen umsetzen. Also das Brettspiel proggen.

Danke für die Infos.

Terep
Avatar = „Odyssee im Weltraum“ Film von Stanley Kubrick (Warner Brothers);
nach dem Buch von Arthur C. Clarke. It will becoming true ?!!
Benutzeravatar
Terep
Beiträge: 53
Registriert: 17.01.2008, 21:20
Wohnort: Hannover Region

Re: java: Parameterübergabe zu Graphic g Methoden (awt)

Beitrag von Terep »

Terep hat geschrieben: Zum Start werden die Anzahl der Spieler als Startwert an die Klasse Spielfeld übergeben. Hier werde ich eine einfache Endlosschleife in einer Grafikmethode installieren und auch würfeln lassen. Innerhalb dieser Schleife werden die Daten an eine entsprechende Methode die Spielerklasse gegeben. Dort werden dann die Spielalgorithmen abgearbeitet (hoffentlich).
Ein schwerer Irrtum meinerseits.

In einer paint-Methode darf nur Grafik sein. Andere Algorithmen haben dort nichts verloren.

Mein Lösungsansatz geht dann über swing um ein Grafikobjekt zu erzeugen. Mittels diesen soll es dann funktionieren.

Hier werde ich erst einmal einen Exkurs machen und dann mein Brettspiel neu anstarten.

Terep
Avatar = „Odyssee im Weltraum“ Film von Stanley Kubrick (Warner Brothers);
nach dem Buch von Arthur C. Clarke. It will becoming true ?!!
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4263
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: java: Parameterübergabe zu Graphic g Methoden (awt)

Beitrag von Chromanoid »

Viel Erfolg! Übrigens ist bei einer Gameloop die Trennung von Grafik und Logik nicht mehr aus technischer Sicht unbedingt nötig, aber sicher wesentlich eleganter. In den meisten anderen Fällen geht sonst ja auch noch ein Verlust der Interaktivität einher.
Virus
Beiträge: 38
Registriert: 20.09.2002, 17:28
Kontaktdaten:

Re: java: Parameterübergabe zu Graphic g Methoden (awt)

Beitrag von Virus »

Woher kommt jetzt die Motivation, Swing einzusetzen? Auch wenn die Schnittstellen sich leicht unterschieden, ist die grundlegende Arbeitsweise davon unabhängig, egal ob AWT, Swing, SWT oder OpenGL.
pUnkOuter
Establishment
Beiträge: 303
Registriert: 15.04.2002, 15:59

Re: java: Parameterübergabe zu Graphic g Methoden (awt)

Beitrag von pUnkOuter »

Übergib einfach allen zeichenbaren Objekten bei der Konstruktion den Graphics Kontext und mach dann ne paint methode, die keinen Kontext als Parameter braucht, sondern den "eigenen" Kontext nimmt und dann die geerbte paint Methode damit aufruft.
Ein Zeiger ins Blaue ist wie ein Wegweiser nach <SEGFAULT>. Wenn du denkst, mein Name hat was mit abgefuckter Kleidung und bunten Haaren zu tun, dann kehr besser um.
Benutzeravatar
Terep
Beiträge: 53
Registriert: 17.01.2008, 21:20
Wohnort: Hannover Region

Re: java: Parameterübergabe zu Graphic g Methoden (awt)

Beitrag von Terep »

Hallo Virus
Am Freitag postete ich frustriert das Thema. Nach einigen Recherchen habe ich jetzt den Kenntnisstand, im Maltool nur Grafik, keine Spielalgorithmen. Das geht mittels einer separaten Grafikklasse, in der die Grafikmethode als Erbmethode dabei ist. Das hast Du ja am Freitag auch gepostet. Ich habe es erst jetzt ansatzweise verstanden und bis ich es umsetzen kann, wird es noch etwas dauern.

In dem Buch von Krüger/Stark „Handbuch der Java Programmierung“ wird empfohlen, erst awt zu erarbeiten und dann später auf swing zu gehen. Daher wollte ich das Brettspiel ohne swing umsetzen. Jetzt habe ich mir andere Literatur besorgt und gelesen, dass die Qualität der Grafik unter swing besser ist, beispielsweise bei Schrägstrichen wegen des Einsatzes von Antialiasing.

Die Umsetzung am Brettspiel werde ich etwas verschieben müssen. Meine theoretischen Kenntnisse sind das eine, die Umsetzung na ja, ist die andere Seite. Ich werde erst mit kleinen Teilprojekten dies und andere erkannte Probleme abarbeiten. Ich hatte einfach losgelegt und konnte das Spielfeld nicht mehr systematisch abarbeiten. Das führte zu 4000 Zeilen Grafikcode. Einfach viel zuviel. Dies werde ich beim 2. Anlauf anders machen.
Na ja, mein Brettspiel sollte nur eine Vorübung für meine eigenen Ideen sein. Jetzt mache ich eben erst die Vor-Vorübung. Was soll’s. Solange ich noch kapiere, was ich tue, geht es.

Hallo Chromanoid
Du hast Recht, eine klare Trennung ist wichtig. Irgendwie war mein Code immer unübersichtlicher geworden. Regeln sollte man einhalten, besonders dann, wenn man schwimmt.

Hallo pUnkOuter
Ja, Dein Posting liest sich wie eine Zusammenfassung meiner Wochenendlektüre.
Werde wohl noch ein paar Tage brauchen, bis ich es umsetzen kann. Leider ist das Wochenende vorbei.

Terep
Avatar = „Odyssee im Weltraum“ Film von Stanley Kubrick (Warner Brothers);
nach dem Buch von Arthur C. Clarke. It will becoming true ?!!
Antworten