Tutorial: Script - Timer/Blinken
Aus LOTUS Wiki DE
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