Triggerfeld
Aus EnigmaWiki
Verfügbare Sprachen: Deutsch, English, Русский
Inhaltsverzeichnis |
Problemstellung
Man hat ein ganzes Feld von Schaltern, die alle eine ähnliche, aber doch verschiedene Aufgabe wahrnehmen.
neuer Lösungsansatz
Jeder Trigger ruft die selbe Funktion auf, aber übergibt dieser ein eindeutiges Kennzeichen, so dass sie entscheiden kann, von welches Trigger der Aufruf kommt.
Lösungsbeispiel
-- Feld mit Brücken erzeugen: for i = 1, 5 do for j = 1, 5 do set_floor("fl-bridge-open",12+i-1,4+j-1,{type="a"}) end end -- Triggerfeld erzeugen: for i = 1, 5 do for j = 1, 5 do set_item("it-trigger", 3+i-1, 4+j-1, {action = "callback", target="openclose_bridge", _mein_attribut_1=i, _mein_attribut_2=j }) end end function openclose_bridge(onoff, sender) -- "onoff" enthält den Zustand des Triggers -- "sender" ist der Trigger selber, als Objekt local mein_i = enigma.GetAttrib(sender, "_mein_attribut_1") local mein_j = enigma.GetAttrib(sender, "_mein_attribut_2") local meine_bruecke = enigma.GetFloor(12+mein_i-1,4+mein_j-1) SendMessage(meine_bruecke,"openclose") end
Das Beispiel ist an das Level "Step gently!" von Manuel König angelehnt.
Analyse
Wir erzeugen zuerst ein 5*5 grosses Feld mit offenen Brücken vom typ a. Danach erzeugen wir ein gleichgrosses Feld mit Triggern, so dass wir jeder Brücke einen Trigger zuordnen können, der sie öffnet und schliesst. Diese Trigger bekommen 2 weitere Attribute, die sie identifizieren, so dass wir in der aufgerufenen Funktion die zum Trigger gehörende Brücke finden können. Dann schicken wir ihr eine "openclose" Message.
Die Funktion openclose_bridge öffnet und schliesst die Brücken. Sie bekommt 2 Parameter. Der Parameter onoff enthält den Zustand des aufrufenden Triggers und sender ist das Triggerobjekt selbst.
alter Lösungsansatz
Bevor es möglich war, einer per action/target callback aufgerufenen Funktion Argumente zu übergeben (Enigma 0.92 und früher), musste man wohl oder übel für alle Trigger eine eigene Funktion definieren. Das ergab eine unmenge an Funktionen, die alle beinahe dasselbe machten. Zum Glück konnte man die erzeugung dieser Funktionen automatisieren und musste sie nicht selbst schreiben.
Lösungsbeispiel
nr = 0 for i=1,5 do for j=1,5 do -- Setzte die Trigger: set_item("it-trigger", 3+i-1, 4+j-1, {action="callback", target="sw"..nr, name="swi"..nr}) -- Definiere die Funktionen als String: func = "function sw"..nr.."() k="..nr.."; local meine_bruecke = enigma.GetFloor(12+"..i.."-1,4+"..j.."-1); SendMessage(meine_bruecke,\"openclose\"); end" -- Führe den String aus: dostring(func) nr = nr+1 end end
Analyse
Wir definieren die Funktion als String, der dann ausgeführt wird und so die nötigen Funktionen erzeugt. Beachte die mit \ escapten "!

