Actorfernsteuerung
Aus EnigmaWiki
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.

