Tutorial: Script - Timer/Blinken

Aus LOTUS Wiki DE
Wechseln zu: Navigation, Suche

Vorlage:ArticleMetadata

Einen Timer oder Blinker zu programmieren, ist nicht ganz trivial, weil solche Möglichkeiten wie "delay" oder "Sleep" nicht genutzt werden können.

1 Prinzip

Da die SimStep-Prozedur in jedem Frame durchlaufen wird, muss sie immer so schnell wie möglich durchlaufen werden und Befehle wie "Delay" oder "Sleep" sind verboten - ebenso unendlich laufende Schleifen.


Um Timer zu programmieren, muss man sich daher den Zeitpunkt "merken", bei dem der Timer gestartet wurde, und dann prüfen, ob die Zeit abgelaufen ist. Wenn dies der Fall ist, dann deaktiviert man den Timer oder setzt ihn zurück.

2 Implementierung

So könnte das ganze im Script aussehen:


Code

 1. [[1]]const
 2. [[2]] TIME_S = 2; // Sekunden
 3. [[3]]
 4. [[4]]var
 5. [[5]] Timer: single; // wenn der Wert negativ ist, dann ist der Timer gestoppt.
 6. [[6]]...
 7. [[7]]
 8. [[8]]function RunTimer: boolean;
 9. [[9]]begin
 10. [[10]] result := false;
 11. [[11]] if Timer > 0 then
 12. [[12]] begin
 13. [[13]] Timer := Timer - Timegap; // Timegap ist übrigens eine Systemvariable und gibt an, wieviel Zeit seit dem letzten Aufruf von SimStep vergangen ist (in Sekunden)
 14. [[14]] if Timer <= 0 then
 15. [[15]] result := true;
 16. [[16]] end;
 17. [[17]]end;
 18. [[18]]
 19. [[19]]procedure SimStep;
 20. [[20]]begin
 21. [[21]]
 22. [[22]] ...
 23. [[23]]
 24. [[24]] // Falls der Timer irgendwann durch irgenein Ereignis gestartet werden soll:
 25. [[25]] Timer := TIME_S;
 26. [[26]]
 27. [[27]] ...
 28. [[28]]
 29. [[29]] // der Timer wird "abgearbeitet"
 30. [[30]]
 31. [[31]] if RunTimer then
 32. [[32]] begin
 33. [[33]] // macht das, was nach Ablauf der Zeit passieren soll
 34. [[34]]
 35. [[35]] // falls es ein dauerhaft laufender Timer sein soll:
 36. [[36]] Timer := TIME_S;
 37. [[37]] end;
 38. [[38]]
 39. [[39]] ...
 40. [[40]]
 41. [[41]]end;
 42. [[42]]
 43. [[43]]procedure Initialize;
 44. [[44]]begin
 45. [[45]]
 46. [[46]]...
 47. [[47]]
 48. [[48]] Timer := -1; // einmal definitiv auf einen negativen Wert setzen, damit der Timer nicht losgeht
 49. [[49]]
 50. [[50]] // ODER
 51. [[51]]
 52. [[52]] Timer := TIME_S; // direkt starten, indem erstmalig die Zeitdauer gesetzt wird
 53. [[53]]
 54. [[54]]...
 55. [[55]]
 56. [[56]]end;

Alles anzeigen