Das richtige Timing ist ein entscheidender Punkt für jedes gute Skript, welches in der Lage sein sollte, auf vielen verschiedenen Systemen laufen zu können. Weil Hollywood für eine Vielzahl von Plattformen verfügbar ist, müssen Sie an die Skript Zeitsteuerung denken, wenn Sie Ihr Skript anderen weitergeben. Das grundlegende Problem ist, dass wenn Sie keinen Geschwindigkeitsbegrenzer Ihrem Skript hinzufügen, es so schnell wie möglich ausgeführt wird. Das könnte kein Problem mit dem 200MHz System sein, aber auf einer 1GHz Maschine ist es sicherlich ein Problem. Stellen Sie sich vor, Sie haben ein Spiel und verwenden die folgende Schleife:
/* Schlechter Code */ While quit = False dir = p_QueryInput() If dir = "Left" Then p_MoveSpriteLeft() If dir = "Right" Then p_MoveSpriteRight() .... p_RedrawDisplay() Wend |
Diese Schleife hat zwei schwerwiegende Probleme:
Die Lösung für das Problem ist recht einfach: Wir müssen Hollywood mitteilen, diese Schleife nur mit einer bestimmten Anzahl von Durchläufen pro Sekunde auszuführen. Für die meisten Spiele ist es völlig ausreichend 25-mal pro Sekunde eine Eingabe abzufragen und Grafiken zu zeichnen. Es gibt zwei Methoden, wie Sie ein Drosseln implementieren können:
/* Guter Code */ StartTimer(1) ; Startet die Uhr #1 While quit = False dir = p_QueryInput() If dir = "Left" Then p_MoveSpriteLeft() If dir = "Right" Then p_MoveSpriteRight() .... p_RedrawDisplay() WaitTimer(1, 40) ; laufe nicht schneller ... ; ... als 40 Millisekunden Wend |
Jetzt wird unsere Schleife nie schneller als 40 Millisekunden ausgeführt. So wird sie nie mehr als 25-mal pro Sekunde ausgeführt werden, weil 25 * 40ms = 1000ms. Daher wird ein Spiel mit dieser Schleife immer mit der gleichen Geschwindigkeit auf jedem System laufen - unabhängig davon, ob die CPU 50MHz oder 1GHz hat.
/* Guter Code */ Function p_MainLoop() ; dieser Code ist derselbe, wie die While-Wend Schleife oben dir = QueryInput() If dir = "Left" Then MoveSpriteLeft() If dir = "Right" Then MoveSpriteRight() .... RedrawDisplay() EndFunction ; ruft MainLoop() 25 Mal in der Sekunde ... ; ... auf -> 40 * 25ms = 1000 Millisekunden SetInterval(1, p_MainLoop, 40) While quit = False WaitEvent Wend |
Dieser Code erledigt das gleiche, wie der Code oben mit WaitTimer(). Der einzige Unterschied ist, dass Sie anstelle von WaitEvent() SetInterval() verwenden müssen, weil Intervallfunktionen Hollywood Ereignisse auslösen.
Beide der oben diskutierten Verfahren sind einfach zu bedienen und effizient. Es ist an Ihnen zu entscheiden, welches Sie bevorzugen.