Bolderfernsteuerung

Aus EnigmaWiki

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

Persönliche Werkzeuge