Jump to content

Empfohlene Beiträge

Geschrieben

Hallo Programmierer,

kann mir jemand helfen? Ich möchte bei folgendem Script in die Schleife eine Verzögerung einbauen:

while $("Flamme").variables["Scale"] >= 0 do
  $("Feuer"):invoke($("Flamme").variables["Scale"])
  $("Flamme").variables["Scale"] = $("Flamme").variables["Scale"] - 0.1
end

"Feuer" ist eine benutzerdefiniertes Funktion: $("Flamme").transformation.scaling = scale

"Flamme" ist das von NEO erstellte "Feuer" zu dem ich eine Variable "Scale" hinzugefügt habe. Ich komme mit dem" deferredcall" nicht klar. Mit Timer hat es auch nicht geklappt.

Geschrieben

Hi Bauerheini

Schreib doch einfach mal eine Verzögerung mit  nachfolgender aktion in der grafischen Oberfläche und wandele diese anschließend in Script um.....

Cheers

Tom

Geschrieben (bearbeitet)
  Am 14.3.2020 um 13:47 schrieb BauerHeini:

Ich möchte bei folgendem Script in die Schleife eine Verzögerung einbauen

Erweitern  

Tu das bitte nicht.

Eine Verzögerung hat in einer Schleife nichts verloren. Und die gestaffelten Befehle für die Änderungen deiner Flamme gehören nicht in eine Schleife. 

  Am 14.3.2020 um 13:47 schrieb BauerHeini:

Ich komme mit dem" deferredcall" nicht klar.

Erweitern  

Weil der nicht in eine Schleife passt.

Schreib bitte einfach eine Folge von Aktionen untereinander, jeweils mit einer Verzögerung dazwischen.
Wie das geht, kannst du in meinem Straßenbahn Beispiel sehen.

Bearbeitet von Goetz
Geschrieben

Hallo Goetz,

es ist ja nur eine Aktion, die mit ab- oder zunehmender Variablen ausgeführt wird. Ich möchte doch nur die Flamme kontinuierlich kleiner werden lassen. Das muss doch in einer Schleife gehen, oder?

Geschrieben (bearbeitet)
  Am 14.3.2020 um 15:05 schrieb BauerHeini:

Das muss doch in einer Schleife gehen, oder?

Erweitern  

Nein, die Verzögerung geht in einer Schleife nicht.
Und ohne Verzögerung würdest du alle Werte in sehr schneller Folge nacheinander in dieselbe Variable schreiben. Das braucht insgesamt weniger Zeit als ein Frame.

Eine Verzögerung legt eine Art Sprungadresse an. Der Code wird dann an dieser Stelle verlassen und nach Ablauf der gewünschten Zeit springt das Skript wieder dorthin.

Du kannst aber eine Schleife nicht temporär verlassen und dabei Schleifenzähler etc. beibehalten.
Weder in Lua, noch in anderen Programmiersprachen.

Bearbeitet von Goetz
Ergänzungen
Geschrieben
  Am 14.3.2020 um 15:16 schrieb Goetz:

Nein, die Verzögerung geht in einer Schleife nicht.
Und ohne Verzögerung würdest du alle Werte in sehr schneller Folge nacheinander in dieselbe Variable schreiben. Das braucht insgesamt weniger Zeit als ein Frame.

Eine Verzögerung legt eine Art Sprungadresse an. Der Code wird dann an dieser Stelle verlassen und nach Ablauf der gewünschten Zeit springt das Skript wieder dorthin.

Du kannst aber eine Schleife nicht temporär verlassen und dabei Schleifenzähler etc. beibehalten.
Weder in Lua, noch in anderen Programmiersprachen.

Erweitern  

Wie würde man denn dann eine Flamme kontinuierlich kleiner bzw größer werden lassen?

Geschrieben (bearbeitet)

Du könntest einen Timer starten und das Ende eines Durchlaufs als Auslöser verwenden, um eine Variable runterzuzählen. Und die Änderung dieser Variablen kannst du wiederum als Auslöser für den nächsten Animationsschritt nehmen. Oder du änderst jeweils direkt den Wert, der die Größe der Flamme bestimmt. Dabei prüfst du in einer Bedingung jedes Mal den Wert der Variablen. Ist der bei 0 angekommen, dann stoppst du den Timer.

Für diesen Zweck sind die Timer in der EV geschaffen worden.

Bearbeitet von Goetz
Geschrieben

Es geht fast. Der Timer heißt "Flamme":

$("Feuer"):invoke($("Ereignisse").variables["z"])
$("Ereignisse").variables["z"] = $("Ereignisse").variables["z"] - 0.1
if $("Ereignisse").variables["z"] <= 0 then
  $("Feuer").timers["Flamme"]:stop()
end

Nur das Beenden hat noch einen Fehler:
[16:40:37]         Skriptfehler (4): Unknown method or property name timers

 

Geschrieben (bearbeitet)
  Am 14.3.2020 um 16:38 schrieb martin51:

das verstehe ich schon, die Frage ist, wo hast du den Timer angelegt und wie heißt er

siehe oben  - Timer

Erweitern  

Wie beschrieben: es gibt ein Unterereignismodul, unter "Ereignisse" mit Namen "Feuer".

image.thumb.jpeg.2c4c08b47bbb1619e346aed4e4249674.jpeg

Bearbeitet von BauerHeini
Geschrieben (bearbeitet)

Dann heißt er $("Feuer").timers["Flamme"]:stop()
Hoffentlich gibt es dann kein zweites Modul, was 'Feuer' heißt...
Ein Objekt sollte man dann aber auch nicht Feuer nennen.
In der grafischen EV wird eine direkte Referenz auf sowas aufgebaut.
Eine einkopierte Zeile in Lua zwingt das MBS sich das Objekt selbst zu suchen - und das kann im falschen gleichnamigen Objekt/Modul enden.

Gruß
  Andy

Bearbeitet von Andy
Geschrieben

ok.

dann sollte es in etwa so aussehen

Ereignis1.thumb.jpg.d37f64707f0486ced8079ad099d7e9a1.jpg

Andy das hat er schon probiert

  Am 14.3.2020 um 15:43 schrieb BauerHeini:

Es geht fast. Der Timer heißt "Flamme":

$("Feuer"):invoke($("Ereignisse").variables["z"])
$("Ereignisse").variables["z"] = $("Ereignisse").variables["z"] - 0.1
if $("Ereignisse").variables["z"] <= 0 then
  $("Feuer").timers["Flamme"]:stop()
end

Nur das Beenden hat noch einen Fehler:
[16:40:37]         Skriptfehler (4): Unknown method or property name timers

 

Erweitern  

Screenshot erstellen, als jpg speichern und dann steht da Datei hier her ziehen oder auswählen

 

Geschrieben (bearbeitet)

Stimmt. Ich hatte zwar hoch gelesen, aber das wieder vergessen und mich nun an Deinem 'Ereignis' orientiert.
Okay Heini, nenne das Modul um in: Feuermodul und dann muß es heißen:
$("Feuermodul").timers["Flamme"]:stop()

Da, wo er gestartet wird, solltest Du auch kontrollieren, ob er da automatisch umbenannt wurde.

Gruß
  Andy

Bearbeitet von Andy
Geschrieben
  Am 14.3.2020 um 16:50 schrieb Andy:

Dann heißt er $("Feuer").timers["Flamme"]:stop()
Hoffentlich gibt es dann kein zweites Modul, was 'Feuer' heißt...

Gruß
  Andy

Erweitern  

 

  Am 14.3.2020 um 16:59 schrieb Andy:

Stimmt. Ich hatte zwar hoch gelesen, aber das wieder vergessen und mich nun an Deinem 'Ereignis' orientiert.
Okay Heini, nenne das Modul um in: Feuermodul und dann muß es heißen:
$("Feuermodul").timers["Flamme"]:stop()

Erweitern  

Vielen Dank Andy,

nach dem Umbenennen funktioniert es. Woran lag es?

Geschrieben

Bei BauerHeini ist Flamme ein Ereignis mit dem Inhalt Timer läuft ab, aber nicht der eigentliche Timer Flamme

 In diesem Ereignis wird erst etwas ausgeführt, wenn der Timer schon gestoppt hat 

Erstelle ein Benutzerkonto oder melde dich an, um zu kommentieren

Du musst ein Benutzerkonto besitzen, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen.

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde dich hier an.

Jetzt anmelden
×
×
  • Neu erstellen...