Benutzer-Werkzeuge

Webseiten-Werkzeuge


advancedtutorials:cutscenes

Cutscenes

Dieses Tutorial dreht sich rund um das Thema Cutscenes. Was ist das eigentlich? Wofür brauche ich sie? Was können sie? Was können sie nicht? Und noch viele andere Fragen sollen geklärt werden. Natürlich gibt es auch eine ausführliche Anleitung, wie man überhaupt welche erstellen kann!

Was sind Cutscenes?

Diese Frage lässt sich relativ leicht beantworten, viel interessanter und wichtiger ist die Frage: Was sind Cutscenes nicht?

Cutscenes sind aus der Kampagne bekannt und sehen einem normalen Briefing sehr ähnlich. Der Unterschied ist allerdings, dass die Kamera nicht an einen festen Ort gebunden ist, sondern man regelrecht durch die Landschaft „fliegt“. Das sieht schön aus und sorgt für Atmosphäre.

Im Prinzip war es das aber auch schon, denn einer Sache sollte man sich bewusst sein: Cutscenes ersetzen keine Briefings. Zwar sieht sich beides sehr ähnlich, aber bei all den Kameraeffekten kann es passieren, dass der Spieler viel mehr auf die Umgebung achtet, als den eventuell eingeblendeten Text zu lesen. Sofern dieser nicht mit einer Sprachausgabe unterlegt ist, sollte man in einer Cutscene auf Text so weit es geht verzichten. Ist die Cutscene vorbei, startet man im Anschluss einfach ein normales Briefing. So haben es die Spieleentwickler auch gemacht.

Cutscenes - alt und neu

Wenn du dich jetzt fragst: „Cutscenes - was ist denn so neu daran?“, dann ist diese Frage berechtigt. In der Vergangenheit gab es bereits Code, mit denen man Cutscenes erstellen und starten konnte. Allerdings werden diese durch den Scriptcode nur simuliert. Wenn du mit dem Code schon mal gearbeitet hast, werden dir sicherlich auch die Nachteile aufgefallen sein: Es ruckelt teilweise fürchterlich und wenn man Pech hat, sieht die selbe Cutscene bei jedem Start anders aus.

Die Cutscenes der Kampagne wurden nicht simuliert - denn das Spiel hat eine eingebaute Cutscene-Engine, die nicht in Lua geschrieben ist. Unter Verwendung dieser Engine, laufen die Cutscenes immer gleich und das auch bedeutend flüssiger, weil sich das Spiel zu diesem Zeitpunkt ganz auf die Darstellung der Cutscene konzentrieren kann.

Allerdings stößt man auf diverse Probleme, wenn man solche „echten“ Cutscenes erstellen möchte. Zum einen können solche Cutscenes nicht einfach über das Script definiert werden, sondern müssen in extra Dateien geschrieben und in die Map „eingebaut“ werden. Dieses Problem lässt sich theoretisch durch die S5Tools lösen. Die andere Schwierigkeit besteht darin, diese Cutscene Dateien zu erstellen. Das „Eingabeformat“ ist nicht leicht und ohne fundierte Mathematik Kenntnisse wohl nur schwer zu durchschauen. Doch auch dafür existiert inzwischen eine komfortable Lösung.

Unterschiede

Eine echte Cutscene kann einige Dinge nicht, die bei simulierten Cutscenes funktionieren:

  • Seiten können nicht einzeln abgebrochen werden
  • Marker, Pointer und Quests sind nicht „eingebaut“

Echte Cutscenes erstellen

Echte Cutscenes zu erstellen ist sehr aufwändig und besteht aus vielen Schritten. Zuerst müssen die Cutscenes mit Hilfe eines kleinen Programms erstellt werden. Dabei wird eine Cutscene-Datei erstellt, die mit den S5Tools in die Map importiert werden muss. Außerdem muss das Script entsprechend vorbereitet werden. Auch der Test eine Cutscene ist nicht leicht, da bei jeder Änderung das Spiel komplett neu gestartet werden muss, damit die Änderungen wirksam werden. Ob sich der Aufwand für dich lohnt, bleibt dir überlassen.

Download der benötigten Programme

Achtung: Die folgenden Programme sind z.Z. noch experimentell und können Fehler enthalten. Verwendung auf eigene Gefahr.

Cutscenes werden im Cutscene-Editor erstellt. Das Programm kann hier heruntergeladen werden und benötigt das Java Runtime Environment ab Version 5.

Um die Cutscenes später in eine Map zu importieren, werden die S5Tools in der speziellen GUI Edition benötigt (benötigt ebenfalls das JRE 5).

Java Programme lassen sich (normalerweise) durch einen Doppelklick auf die jar-Datei starten. Bis sich ein Fenster öffnet können einige Sekunden vergehen.

Zusätzlich wird eine abgewandelte Version der Cutscene-Creating-Tools benötigt. Im Gegensatz zur Cutscene-Simulation ist bei einer echten Cutscene die Angabe der Z-Position notwendig. Ansonsten muss experimentiert werden ;-).

Cutscenes definieren

Starte den Cutscene-Editor und erstelle über das Datei-Menü eine neue Cutscene-Datei. In dieser Datei werden alle Daten gespeichert. Sie hat die Endung 's5f' und wird später in deine Map importiert. Merke dir also wo du die Datei abspeicherst.

Du siehst jetzt eine Baumstruktur deiner Cutscenes, die bisher noch recht leer ist. Rechtsklicke auf den einzigen Eintrag in der Liste (normalerweise ist das der Eintrag mit dem Namen der Datei). Es erscheint ein Kontextmenü, mit dem du neue Cutscenes der Datei hinzufügen kannst (eine Datei kann mehrere Cutscenes enthalten). Jetzt gibst du einen Namen für die Cutscene ein. Dieser wird später noch im Script benötigt.

Im Kontextmenü der Cutscenes kannst du neue Kameraflüge hinzufügen oder die Cutscene wieder löschen. Auch die Kameraflüge haben ein Kontextmenü, in dem du sie löschen oder verschieben kannst.

Sobald du einen Kameraflug anklickst, erscheinen an der rechten Seite Eingabefelder für alle Daten zu dem Flug. Wer schon mit den alten Cutscenes gearbeitet hat, wird Bekanntes vorfinden. Flugdauer und Verzögerung werden bei der Startposition ignoriert. Hat die Flugdauer bei einem Flug die Länge 0, so wird zu der Position innerhalb der Cutscene gesprungen. Die Lua-Funktion kann man mit der action-Funktion eines Briefings vergleichen und muss ohne Klammern angegeben werden. Mehr Details dazu folgen später.

Wenn du alle Daten eingegeben hast, vergiss nicht zu speichern.

Cutscenes importieren

Starte jetzt das S5Tools GUI Programm. Der Assistent sollte soweit selbsterklärend sein. Auf „Weiter“ klicken, die Aktion „Cutscenes einer Map hinzufügen“ wählen, Map eintragen, Cutscene-Datei eintragen und Aktion starten. Dabei werden dann die Informationen in das interne Spielformat umgerechnet und gespeichert.

b1.jpg b2.jpg b3.jpg

Cutscenes im Script kontrollieren

Im Cutscene-Editor konntest du für jeden Kameraflug den Namen einer Lua-Funktion angeben, die zum Zeitpunkt des Fluges aufgerufen werden soll (vergleichbar mit der action-Funktion bei einem Briefing). Diese Funktion kann dazu benutzt werden, um Text anzuzeigen, Effekte auszulösen usw.

Nehmen wir an du hast eine Cutscene namens Intro erstellt und beim Kameraflug 2 als Lua-Funktion Seite2 eingetragen. Selbst wenn du jetzt im Script die Funktion Seite2() hast, wird sie nicht aufgerufen. Das liegt daran, dass alle Cutscene-Funktionen nach einem bestimmten Muster benannt werden müssen.

Alle Funktionen, die zur Steuerung von Cutscenes im Script nötig sind, beginnen immer mit dem Präfix Cutscene_, gefolgt von dem Namen der Cutscene wie er im Cutscene-Editor angegeben wurde und einem weiteren Unterstrich (_). Danach kommt der Name der Lua-Funktion. In dem Beispiel müsste im Script eine Funktion namens Cutscene_Intro_Seite2() existieren, damit es funktioniert. Heißt die Cutscene foo und die Lua-Funktion bar muss die Funktion Cutscene_foo_bar() heißen.

Text?!

Um Text auf einer Seite anzuzeigen, kann man die Funktion PrintBriefingText() benutzen. Denke aber daran, keinen wichtigen Text in Cutscenes unterzubringen (also insbesondere keine Gespräche zwischen Personen oder für den Quest relevanten Informationen).
Der Titel kann mit PrintBriefingHeadline() gesetzt werden. Soll der Titel dieselbe Farbe wie in Briefings haben, so muss COLOR1 mit dem eigentlichen Titel verkettet werden.

-- Text auf "Seite 2" anzeigen
function Cutscene_Intro_Seite2()
 
    PrintBriefingHeadline(COLOR1 .. "Mentor")
    PrintBriefingText("Ein schöner Tag ist das heute...")
 
end

Cutscenes starten

Damit eine Cutscene ordnungsgemäß funktioniert, müssen sich zusätzlich zu jeder Cutscene drei Funktionen im Script befinden: eine Start, Cancel und Finished Funktion. Die Start-Funktion wird automatisch vor dem Start der Cutscene aufgerufen; die Cancel-Funktion wird aufgerufen, wenn die Cutscene mit der Esc-Taste abgebrochen wird und die Finished-Funktion wird am Ende der Cutscene aufgerufen.

Dem Beispiel von oben folgend, sollten die drei Funktionen so aussehen:

-- Start-Funktion für die Intro-Cutscene
function Cutscene_Intro_Start()
 
    -- In der Start-Funktion muss immer der Kinomodus aktiviert werden,
    -- denn dieser ist nicht automatisch vorhanden
    Interface_SetCinematicMode(1)
 
end
 
-- Finished Funktion
function Cutscene_Intro_Finished()
 
    -- Hier muss der Kinomodus wieder deaktiviert werden
    Interface_SetCinematicMode(0)
 
    -- Der Aufruf von CutsceneDone() ist ebenfalls zwingend erforderlich!
    CutsceneDone()
 
end
 
-- Cancel-Funktion
function Cutscene_Intro_Cancel()
 
    -- Hier reicht es oft aus, einfach die Finished-Funktion aufzurufen
    Cutscene_Intro_Finished()
 
end

Wenn sich diese drei Funktionen für jede(!) Cutscene im Script befinden, kann die Cutscene mit der Funktion StartCutscene() gestartet werden. Sie bekommt als Parameter zum einen den Namen der Cutscene und zum anderen eine Callback-Funktion (vgl. Briefing-Finished), diese ist aber optional.

-- Die Cutscene namens Intro starten
StartCutscene("Intro", IntroFinished)

Achtung: Damit das funktioniert, darf sich nicht der alte Cutscene-Code hier aus dem Wiki im Script befinden!

advancedtutorials/cutscenes.txt · Zuletzt geändert: 2021/09/18 19:15 (Externe Bearbeitung)