Bolderfernsteuerung
Aus EnigmaWiki
Verfügbare Sprachen: Deutsch, English, Русский
Inhaltsverzeichnis |
Bolderfernsteuerung mit einem Bolder
Problemstellung
Man hat einen (oder mehrere) Bolder (st-bolder) und möchte diese gerne Kontrollieren.
Lösungsansatz
Im Prinzip ist das Problem ganz einfach. Wir machen nur von Messages gebrauch. Das Kapitel Messages und Signals wird also vorausgesetzt.
Wir haben nun also 4 Schalter, einen für jede Richtung, in die wir den Bolder steuern können wollen. Jeder dieser Schalter schickt dem Bolder die Message, er solle seine Richtung ändern.
Lösungsbeispiel
function go_north() SendMessage("bolder1","direction",NORTH) end function go_east() SendMessage("bolder1","direction",EAST) end function go_south() SendMessage("bolder1","direction",SOUTH) end function go_west() SendMessage("bolder1","direction",WEST) end function get_new() set_stone("st-bolder",5,5,{name="bolder1", direction="NORTH"}) end function kill_old() local boldi = enigma.GetNamedObject("bolder1") if boldi ~= nil then enigma.KillStone(enigma.GetPos(boldi)) end end -- Controll room: set_stone("st-switch",0,1,{action="callback", target="kill_old"}) set_stone("st-switch",1,0,{action="callback", target="get_new"}) set_item("it-trigger",2,1,{action="callback", target="go_north"}) set_item("it-trigger",2,3,{action="callback", target="go_south"}) set_item("it-trigger",1,2,{action="callback", target="go_west"}) set_item("it-trigger",3,2,{action="callback", target="go_east"})
Analyse
Zuerst werden 4 Funktionen definiert, mit denen man den Bolder in die entsprechende Richtung lenken kann. Dies geschieht per SendMessage.
Weiter wollen wir unseren Bolder entfernen und neusetzten können. Beim entfernen müssen wir noch darauf achten, dass der Bolder überhaupt bereits/noch existiert!
Der Kontrollraum besteht ganz schlicht aus Schaltelementen, die die entsprechenden Funktionen aufrufen.
Bolderfernsteuerung mit beliebig vielen Boldern
Problemstellung
Man hat mehrere (beliebig viele) Bolder (st-bolder) und möchte diese gerne Kontrollieren.
Lösungsansatz
Das Grundprinzip ist das selbe wie vorhin. Hinzu kommt die Verwaltung von mehreren Boldern. Am einfachsten halten wir deren Namen in einer Liste (Array) fest und Iterieren dann darüber.
Lösungsbeispiel
function go_north(my_name) SendMessage(my_name,"direction",NORTH) end function go_east(my_name) SendMessage(my_name,"direction",EAST) end function go_south(my_name) SendMessage(my_name,"direction",SOUTH) end function go_west(my_name) SendMessage(my_name,"direction",WEST) end function get_new(new_name) set_stone("st-bolder",5,5,{name=new_name, direction="NORTH"}) end function kill_old(my_name) local boldi = enigma.GetNamedObject(my_name) if boldi ~= nil then enigma.KillStone(enigma.GetPos(boldi)) end end -- Listenverwaltung: local boldercounter = 0 local bolderlist = {} function add_new_to_list() local akt_name = "bolder"..boldercounter get_new(tostring(akt_name)) table.insert(bolderlist,tostring(akt_name)) boldercounter = boldercounter +1 end function delete_last_in_list() local akt_bolder = bolderlist[table.getn(bolderlist)] if akt_bolder ~= nil then kill_old(akt_bolder) table.remove(bolderlist) end end -- Warpper für die go_* funktionen: function move_all_north() for k,v in pairs(bolderlist) do local itsname = bolderlist[k] go_north(itsname) end end function move_all_east() for k,v in pairs(bolderlist) do local itsname = bolderlist[k] go_east(itsname) end end function move_all_south() for k,v in pairs(bolderlist) do local itsname = bolderlist[k] go_south(itsname) end end function move_all_west() for k,v in pairs(bolderlist) do local itsname = bolderlist[k] go_west(itsname) end end -- Controll room: set_stone("st-switch",0,1,{action="callback", target="delete_last_in_list"}) set_stone("st-switch",1,0,{action="callback", target="add_new_to_list"}) set_item("it-trigger",2,1,{action="callback", target="move_all_north"}) set_item("it-trigger",2,3,{action="callback", target="move_all_south"}) set_item("it-trigger",1,2,{action="callback", target="move_all_west"}) set_item("it-trigger",3,2,{action="callback", target="move_all_east"})
Analyse
Die grundlegende Logik zum bewegen der Bolder ist dieselbe. Neu sind die Funktionen, um die Boldernamen in einer Liste zu speichern. Genauer haben wir eine Funktion, die einen neuen Bolder erzeugt und seinen Namen dann in die Liste schreibt. Eine andere Funktion löscht den jeweils letzten Bolder in der Liste.
Um die Bolder zu bewegen haben wir nun die Funktionen move_all_*. Sie tun nichts anderes, als für jeden Bolder die Funktionen go_*, die wir von oben kennen, aufrufen.

