2009-08-06 11 views
0

Ich entwickle ein Grid-basiertes Sim-Spiel in Java, und ich frage mich, ob es eine Standardmethode gibt, das Folgende zu tun. Ich habe ein Panel, das das Spiel-Panel ist, und es gibt viele verschiedene Dinge, die passieren können, wenn das Panel angeklickt wird. Wenn Sie beispielsweise einen Raum erstellen, gibt es mehrere Stufen, bei denen das Ziehen der Maus und das Klicken mit der linken Maustaste unterschiedliche Aktionen haben. Genau so, wie ich es gemacht habe, verwende ich booleans, um zu überprüfen, was gebaut wird und auf welcher Stufe es ist.Gibt es eine Standardmethode, um viele verschiedene Optionen für Mausereignisse in Java zu handhaben?

Gibt es eine bessere oder Standardmethode, um so etwas zu handhaben? Ich hatte eine schnelle Google-Suche, aber wie bereits erwähnt, geben die Leute auf Stack Overflow immer eine bessere, relevantere und aktuellere Antwort.

Ich halte mich selbst noch ziemlich neu in Java.

Vielen Dank im Voraus.

Antwort

3

Sie könnten versuchen, etwas ähnlich wie das Strategie-Muster zu untersuchen.

Im Grunde beginnen Sie, indem Sie auf die Raumschaltfläche in Ihrer Symbolleiste klicken. Die Symbolleiste führt durch und teilt dem Raster mit, dass es den ActionListener 'room place' verwenden soll. Vermutlich Entfernen Zuhörer jeden vorherige Aktion, die

Die Zimmer Platz Action würde wiederum implementieren alle interessant bisschen Logik für Links-/Rechtsklick zuhörte, Ziehen, usw.

Wenn Sie für den Aufbau einen Raumes mehr Stufen haben (Sagen wir zum Beispiel Türen, dann Fenster und dann Türen). Die Aktionshörer wären dafür verantwortlich, die Kontrolle an die nächste Stufe abzugeben: ein Stück einer endlichen Zustandsmaschine.

Also, durch Klicken auf "Raum" -Taste, "Ort Raum" Hörer wird hinzugefügt. Ziehe den Bereich, in dem der Raum sein soll, raus. "Raum platzieren" ändert den Spielstatus und ändert dann den aktionslistener in den Listener "Platziere Fenster". Ad infinitum ... bis du fertig bist.

Ein sehr einfaches (nicht übersetzbar) Beispiel:

class GridPanel extends JPanel 
{ 
    void SetMouseListener(MouseListener newListener) 
    { 
     for(MouseListener ml : getMouseListeners()) 
      removeMouseListener(ml); 
     addMouseListener(newListener); 
    } 
} 

class ControlPanel extends JPanel 
{ 
    GridPanel gameGrid; 

    void OnRectangleButtonClicked(some stuff) 
    { 
     gameGrid.SetMouseListener(new PlaceRoomListener(gameGrid)); 
    } 
} 

class PlaceRoomListener extends MouseAdapter 
{ 
    GridPanel gameGrid; 

    //constructor, etc 

    void OnClick(mouse event) 
    { 
     gameGrid.doCoolStuff(); 
     gameGrid.SetMouseListener(new PlaceTrapDoorListener()); 
    } 
} 

//etc 

Nun, das nicht übersetzbar Beispiel beiseite, tut Pyrolistical einen Punkt: Sie in der Regel nicht wollen, Ihr Spiel Modell und grafische Oberfläche kombinieren in ein einziger Klassenklumpen. Sie möchten, dass das Modell von der GUI getrennt und über eine gut definierte Schnittstelle manipuliert wird.

(Auch gibt es wahrscheinlich bessere Methoden für das Gehen über den Maus-Listener entfernen dann das Entfernen nur zufällig alle Zuhörer ... war ich in einem wenig Eile, sorry)

+0

Das klingt interessant. Kannst du mich mit irgendwelchen Beispielen verbinden, in denen dieses Muster implementiert wird? oder ist es üblich genug, dass ich es finden kann? Ich habe vor kurzem eine andere die Fabrik Methode Patten für eine andere Logik, aber das ist nicht wirklich mit dieser Frage verbunden. Es ist interessant, dass es so viele etablierte Möglichkeiten gibt, Dinge zu tun :) – Relequestual

+1

http://en.wikipedia.org/wiki/Strategy_pattern. Das heißt, aber es läuft im Grunde darauf hinaus, eine gemeinsame Schnittstelle zu implementieren, damit Implementierungen, die verschiedene Dinge tun, ausgetauscht werden können. Meine Verwendung des Begriffs hier mag ungültig sein, aber ich denke, es ist nahe genug in der Absicht. – CoderTao

+0

Danke, das ist interessant. Es kann ein Weg sein, es zu tun. Hast du es schon mal mit Action-Listenern gemacht? oder spekulierst du? Ich versuche darüber nachzudenken, wie dies umgesetzt werden würde. Ich denke, ich kann es ausarbeiten, aber ich bin eher schlafen :). Ich denke im Wesentlichen, ich habe dies auf rohe Weise mit Booleans getan, aber mit dieser Strategie Patten sieht aus wie ein viel besserer Weg, um es zu tun, und mit weniger Chaos! – Relequestual

0

Es klingt wie Sie müssen Ihr Spielmodell/Zustand definieren und halten Sie es getrennt von Ihren Mausaktionen.

Verwenden Sie MVC?

+0

ich Angst habe ich nicht weiß, Was MVC ist ... – Relequestual

+0

Jetzt ist eine gute Zeit zu lernen. http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93Controller –

+0

In diesem Fall glaube ich, dass ich bin. Ich habe es noch nie gehört. Mausereignisse werden behandelt, Daten werden manipuliert und die Änderung wird dem Benutzer angezeigt. Im Wesentlichen funktionieren die meisten Desktop-Anwendungen (insbesondere Spiele) nicht so? – Relequestual

Verwandte Themen