Actorfernsteuerung

Aus EnigmaWiki

Wechseln zu: Navigation, Suche
Verfügbare Sprachen: Deutsch, English, Русский

Inhaltsverzeichnis

Actors fernsteuern

Problemstellung

Ein Actor soll von einem anderen gesteuert werden. Wir wollen hier keinen st-flash benützen, sondern eine Lösung mittels Lua Code anstreben.

Lösungsansatz

Wir legen unter die zu steuernde Kugel ein fl-gradient, der die Kugel in die gewünschte Richtung bewegt. Nachher können wir den Gradient wieder mit dem normalen Boden überschreiben.

Einfaches Lösungsbeispiel

function clear_gradient()
    set_floor("fl-rough", ballx, bally)
end
 
function move(onoff, sender)
    local sender_dir = enigma.GetAttrib(sender, "_dir")
 
    -- (Un)comment this to remove the gradients set:
    clear_gradient()
 
    ballx, bally = enigma.GetPos(enigma.GetNamedObject("whiteball"))
 
    if onoff==1 then
        if sender_dir == "n" then
            set_floor("fl-gradient",ballx, bally,{type="22"})
        elseif sender_dir == "e" then
            set_floor("fl-gradient",ballx, bally,{type="23"})
        elseif sender_dir == "s" then
            set_floor("fl-gradient",ballx, bally,{type="21"})
        elseif sender_dir == "w" then
            set_floor("fl-gradient",ballx, bally,{type="24"})
        else
            --default
        end
 
    end
end
 
set_item("it-trigger",2,9,{action="callback",target="move", _dir="n"})
set_item("it-trigger",3,10,{action="callback",target="move", _dir="e" })
set_item("it-trigger",2,11,{action="callback",target="move", _dir="s"})
set_item("it-trigger",1,10,{action="callback",target="move", _dir="w"})
 
set_actor("ac-blackball",2.5,10.5,{player="0"})
local the_whiteball = set_actor("ac-whiteball",1.5,1.5, {name="whiteball"})

Analyse

Das Problem bei dieser Lösung ist, dass die Kugel aufhört sich zu bewegen, sobald sie von Gradient gerollt ist. Danach muss man wieder einen Trigger betätigen, um die weisse Kugel zu bewegen. Man kann sie also nur stückchenweise bewegen. Das ist auf die Länge recht mühsam.

Erweitertes Lösungsbeispiel

for x=1, 18 do
    for y=1, 7 do
        set_item("it-sensor",x,y,{action="callback",target="move_white"})
    end
end
 
function clear_gradient()
    set_floor("fl-rough", ballx, bally)
end
 
function move_white()
    -- Uncomment this to remove the gradients set:
    --clear_gradient()
    ballx, bally = enigma.GetPos(enigma.GetNamedObject("whiteball"))
 
    if direction == "n" then
        set_floor("fl-gradient",ballx, bally,{type="22"})
    elseif direction == "e" then
        set_floor("fl-gradient",ballx, bally,{type="23"})
    elseif direction == "s" then
        set_floor("fl-gradient",ballx, bally,{type="21"})
    elseif direction == "w" then
        set_floor("fl-gradient",ballx, bally,{type="24"})
    else
        -- No direction set, do not move
    end
end
 
function set_dir(onoff, sender)
    local sender_dir = enigma.GetAttrib(sender, "_dir")
    if onoff == 1 then
        direction = sender_dir
    else
        direction = nil
    end
    move_white()
end
 
set_item("it-trigger",2,9,{action="callback",target="set_dir", _dir="n"})
set_item("it-trigger",3,10,{action="callback",target="set_dir", _dir="e" })
set_item("it-trigger",2,11,{action="callback",target="set_dir", _dir="s"})
set_item("it-trigger",1,10,{action="callback",target="set_dir", _dir="w"})
 
set_actor("ac-blackball",2.5,10.5,{player="0"})
local the_whiteball = set_actor("ac-whiteball",1.5,1.5, {name="whiteball"})

Analyse

In diesem erweiterten Beispiel bewegt sie die Kugel, solange man auf dem entsprechenden Trigger bleibt. Verlässt man ihn, werden keine neuen Gradients mehr gesetzt. Die Kugel wird ihre Bewegung wegen der Reibung verlangsamen und erst allmählich zum Stillstand kommen.

Das Problem bei dieser Lösung ist, dass wir den Boden mit it-sensor gepflastert haben, und man somit keine weiteren Items mehr ablegen kann. Eine Lösung dafür wäre, einen Timer einzusetzten. Aber dann ist die flüssige Bewegung der Kugel nicht mehr garantiert.

Persönliche Werkzeuge