RoomListener
(Thomas Dautzenberg)
In der Programmstruktur die wir übernommen haben, wurden bereits Listener als Erweiterungen der Klasse MouseInputAdapter benutzt, um das Zeichnen von Objekten zu initiieren. Da wir in unserem Leveleditor jedoch nicht nur Level zeichnen, sondern diese auch hinterher speichern wollen, muss das Level intern gespeichert und aktualisiert werden. Hierum kümmert sich ebenfalls der RoomListener, da er an genau der Stelle eingesetzt wird, an der dies geschieht.
RoomListener
Um einen RoomListener zu erstellen, benötigen wir das DrawableObjectsProcessing, welches sich um das tatsächliche Zeichnen kümmert, einen Raum, den wir als Vorlage benutzen und das derzeit gespeicherte Level.
mouseClicked
In dieser Methode werden die wichtigsten Funktionen des RoomListeners erfüllt.
Zuerst wird geprüft, ob wir bereits einen Room auf der Zeichenfläche haben. Wir benutzen dazu einen private Point mousePos. Ist dieser null, so haben wir keinen Room auf der Zeichenfläche. In diesem Fall wird die Mausposition gespeichert und ein Room mithilfe der Vorlage erstellt.
War mousePos jedoch nicht null, also ein Room vorhanden, so prüfen wir, um welche Maustaste es sich handelt.
Ein Klick mit der rechten Maustaste rotiert den Room. Wir rufen hierzu die rotate Methode des angezeigten Rooms auf, und rotieren anschließend alle seine Wege. Da die Rotation die Ansicht auf den Room verändert, aktualisieren wir das temporär zu zeichnende Objekt. Rotiert wird um die Maus herum als Mittelpunkt, was die Handhabung stark vereinfacht.
Wurde mit der linken Maustaste geklickt, versuchen wir den Room zu zeichnen. Bevor dies geschehen kann, muss allerdings geprüft werden, ob wir uns dafür überhaupt an der richtigen Stelle befinden.
if (room.compareWays(level.getWays())) {...}
Wir rufen also die Methode compareWays unseres Rooms auf, und übergeben die Liste der Wege die wir derzeit in unserem Level haben. Der Room überprüft dann von selbst ob Wege entsprechend übereinstimmen und kürzt seine eigene Wegliste und die des Levels, sollte dies der Fall sein. Außerdem gibt er true zurück, wodurch wir wissen, dass wir den Room hinzufügen und zeichnen können.
Dem Level werden der Room und seine Wege einzeln hinzugefügt, der Room wird entgültig gezeichnet und die Mausposition auf null gesetzt. Anschließend aktualisieren wir unser XMLPanel und schreiben eine XMLDatei, in der das aktuelle Level gespeichert ist.
mouseMoved
Wenn sich die Maus bewegt, so soll sich der zu zeichnende Room - falls vorhanden - mitbewegen. Um dies zu gewährleisten, aktualisieren wir hier die gespeicherte Mausposition und übergeben diese an den gespeicherten Room als neuen Mittelpunkt. Um sicherzustellen, dass die Änderungen angezeigt werden, lassen wir unser DrawableObjectsProcessing anschließend das temporäre Zeichenobjekt aktualisieren.
mouseExited
Verlässt der Cursor die Zeichenfläche, soll, ähnlich wie bei den zuvor vorhandenen Listenern, das Zeichenobjekt gelöscht werden. Wir setzen dazu noch die intern gespeicherte Mausposition und den zu zeichnenden Room auf null um bei erneutem Klicken auf die Zeichenfläche einen frischen Start zu gewährleisten.