Dies ist eine alte Version des Dokuments!
Eine Siegbedingung formulieren
Um einen vollständigen Spielablauf zu erhalten, muss der Spieler sowohl gewinnen als auch verlieren können. Gewonnen hat der Spieler, wenn er das feindliche Haupthaus zerstört. Verloren hat er, wenn er das eigene verliert.
Da eine dieser beiden Bedingungen jederzeit eintreffen kann, müssen wir beide zu jeder Zeit prüfen. Dazu verwenden wir einen sogenannten SimpleJob. Ein SimpleJob ist ein Trigger, der jede Sekunde ausgelöst wird.
Wir werden Trigger im zugehörigen Kapitel näher beleuchten. Im Moment soll uns die Vorstellung genügen, dass im Spiel automatisch verschiedene Ereignisse/Events ausgelöst werden (siehe dazu auch Ereignisse im Spielablauf). Für jedes dieser Events kann man (theoretisch beliebig viele) Trigger registrieren. Der Trigger ist im einfachsten Fall einfach nur eine Funktion, die als Reaktion auf das zugehörige Ereignis automatisch aufgerufen wird.
Beispielsweise ist ein Event der Wetterwechsel. Der zugehörige Trigger sorgt dafür, dass der Mentor den Wetterwechsel ankündigt. Im Fall eines SimpleJob ist das Event, dass eine Sekunde Spielzeit vergangen ist. So rufen wir also in jeder Sekunde eine Funktion im Skript auf. Damit können wir die Sieg- und Niederlagebedingungen definieren: Da wir nicht wissen, wann das gegnerische Haupthaus zerstört wurde, fragen wir einfach jede Sekunde, ob es noch steht. Sobald es nicht mehr steht, hat der Spieler gewonnen. Die Niederlagebedingung funktioniert analog.
Zu Beginn des Spiels starten wir beide SimpleJobs mit der Funktion StartSimpleJob
in der FirstMapAction
, zusammen mit dem Briefing und der Definition des Computergegners. Der Name der Funktion, die jede Sekunde aufgerufen werden soll, muss als String angegeben werden:
function FirstMapAction() CreatePlayer2() CreateBriefingIntro() StartSimpleJob("VictoryCondition") StartSimpleJob("DefeatCondition") end
Wichtig: Für die Namen der SimpleJob-Funktionen gelten die gleichen Regeln wie für Variablen. Beachte, dass SimpleJobs keine Parameter entgegen nehmen.
Die beiden Funktionen VictoryCondition
und DefeatCondition
sehen zueinander recht ähnlich aus:
function VictoryCondition() -- Die Funktion IsDead nimmt einen Entity-Namen als Parameter und gibt einen Boolean zurück -- Wenn die Entity mit dem angegebenen Namen noch lebt, wird false zurückgegeben -- Wenn die Entity mit dem angegebenen Namen nicht mehr lebt, wird true zurückgegeben -- Die if-Bedingung ist also genau dann erfüllt, wenn "Player2" nicht mehr lebt if IsDead("Player2") then -- Victory bewirkt den Sieg für den menschlichen Spieler. Er erhält dann den -- entsprechenden Bildschirm mit der "Hurra, Ihr habt das Spiel gewonnen"-Meldung Victory() -- Die Rückgabe von true bewirkt, dass der Trigger beendet wird. Würden wir den -- Trigger an dieser Stelle nicht beenden, würde der Sieg beim Fall der Burg -- jede Sekunde ausgelöst werden. -- Wenn wir den Trigger beenden, wird der Sieg genau 1 mal ausgelöst, sobald die -- Burg fällt return true end end function DefeatCondition() -- Die Bedingung für die Niederlage ist der Fall der Spielerburg if IsDead("Player1") then -- Defeat bewirkt die Niederlage für den menschlichen Spieler. Er erhält dann -- den Bildschirm mit der "Oh nein, Ihr habt das Spiel verloren"-Meldung Defeat() -- Auch in diesem Fall soll die Niederlage nur genau 1 mal ausgelöst werden, -- weshalb wir den Job nach dem Fall der Burg sofort beenden return true end end
Das Skript unserer Beispielkarte ist damit vollständig und bereit für Tests. In den nächsten Kapiteln besprechen wir, wie Fehler im Skript gefunden werden können und wie mit Testergebnissen umzugehen ist.
Das vollständige Skript unserer Beispielkarte inklusive der Kommentare findest du hier.
Tipp: Um einen SimpleJob besser nachvollziehen zu können und „sichtbarer“ zu machen, kannst du auf einer Testmap folgenden Testjob starten:
function FirstMapAction() -- Definiere eine globale Zählvariable MyCounter = 0 StartSimpleJob("CounterJob") end function CounterJob() -- Zähle jede Sekunde die globale Zählvariable um 1 nach oben MyCounter = MyCounter + 1 -- Zeige den aktuellen Zählstand im Spiel an Message(MyCounter) -- Wenn der Zähler den Wert 10 erreicht hat, beende den Job if MyCounter >= 10 then return true end end
Im Spiel kannst du dann beobachten, wie die Zahlen von 1 bis 10 angezeigt werden und der SimpleJob dann beendet wird.
Voriges Kapitel: Einen Computergegner platzieren
Zurück nach oben
Zurück zur Übersicht