Triggerfeld

Aus EnigmaWiki

Wechseln zu: Navigation, Suche
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 "!

Persönliche Werkzeuge