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)
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
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
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