Tach.
Ich programmiere gerade ein Such-/Logikspiel in Javascript, bei dem der Spieler in einer Sammlung von Truhen bestimmte Gegenstände finden muß. Die Inhalte wechseln in jedem Spielschritt nach einem festen Algorithmus, den es zu erkennen gilt, zwischen den Truhen.
Jede Truhe ist ein eigenständiges Javascript-Objekt, welches auch ein HTMLImageElement enthält, das die Truhe auf dem Bildschirm repräsentiert. Jede Truhe reagiert auf click-Events ihres zugehörigen Bildes. Alle Truhenbilder sind als Elemente einer HTML-Liste zusammengefaßt, die sozusagen das Spielfeld darstellt.
Soviel zur Vorgeschichte ... Mein Problem ist folgendes:
Der Spieler darf immer nur eine begrenzte Anzahl Truhen pro Spielzug öffnen, um sich den Inhalt anzuschauen. Ich hatte mir das so vorgestellt, daß das Spielfeld als eine Art Schiedsrichter überwacht, welche Truhen geöffnet sind und ggf. das Öffnen weiterer Truhen unterbindet. Da die Liste aber das Elternelement der Truhen im Elementbaum darstellt, erreicht der click-Event sie erst, *nachdem* er onclick bei den Truhen getriggert hat. Folgende drei Varianten, dieses Problem in den Griff zu kriegen, habe ich mir überlegt:
1. Jede Truhe überprüft in ihrem onclick-Handler den Zustand eines *globalen* Zählers. D. h. nicht das Spielfeld sondern die einzelnen Truhen fungieren als Schiedsrichter.
2. Nicht die Truhe selber, sondern das Spielfeld reagiert auf die click-Events, die normalerweise die Truhe veranlassen, sich zu öffnen.
3. Den Truhen wird schrittweise die Fähigkeit, auf die Klicks zu reagieren entzogen, indem ihr onclick-Handler überschrieben wird.
Methode 1 wäre die einfachste, die ich aber für ziemlich unsauber halte. Rumgebolze mit globalen Variablen führt auf lange Sicht fast immer zu Problemen. Methode 3 erscheint mir ziemlich umständlich und führt wahrscheinlich auch nicht zu mehr Übersichtlichkeit als Methode 2. Mir wäre es zwar lieber, die Truhen kümmerten sich – wie bisher – *selber* um ihr onclick-Handling, allerdings scheint mir Methode 2 insgesamt das geringste Übel zu sein.
Habt Ihr Alternativen und/oder Anmerkungen zu den obigen 3 Methoden?
Once is a mistake, twice is jazz.