Einen wunderschönen Tag euch
Ich habe für mein Projekt ein kleines Quick Time Event gebastelt und dachte mir ich könnte das doch mit euch teilen. Ich werde hier aber keine Demo oder fertige Files veröffentlichen, im gegenteil wir bauen das zusammen damit du verstehst wie es funktioniert Auch würde ich mich über Verbesserungen freuen wenn jemand Ideen dazu hat oder Balancing Vorschläge
Was wird benötigt?
- Yanflys Gab Window (Optional)
- 1 Common Event für das QTE
- 4 Common Event's für die Buttons
- 2 Schalter
- 3 Variablen
Gut dann wollen wir los legen
Als erstes legen wir unsere Variablen an. Ihr könnt die Nummern beliebig verwenden aber notiert sie euch da das Event sehr umfangreich ist.
Ich verwende Variable 1 bis 3:
1 = QTE - System
2 = QTE - RandomButton
3 = QTE - Keybind
Als Schalter verwende ich ebenfalls 1 und 2:
1 = QTE-ON/OFF
2 = QTE-FAIL
Wenn ihr das habt starten wir mit unseren erstem Common Event:
Legt als erstes die Buttons fest mit Yanflys Common Button.
Wir brauchen das für jede Taste die ihr verwenden möchtet. Die Variable "QTE - Keybind" wird hierbei immer erhöht.
So sieht es bei mir aus:
A = QTE - Keybind 1
S = QTE - Keybind 2
D = QTE - Keybind 3
F = QTE - Keybind 4
Wichtig dabei ist hier keinen Keybind mit 0 zu belegen da wir die später brauchen um die Buttons zu resetten.
Wenn ihr die 4 Keybind angelegt hat geht es nun zum Event start.
Dieser Bereich ist nicht sehr groß aber man sollte ihn gut behandeln
Legt am besten ein Start Event an, der als Vorlage dient! Daraus könnt ihr später dann euer QTE jederzeit kopieren.
1) Starten wir einfach, in jedem Level gibt es Musik und wir wollen unserer QTE natürlich diese Musik passend zur Scene unterbrechen aber wieder fortführen. Also beginnen wir indem wir die Musik speichern, ausblenden und unsere neue starten.
2) Nun sperren wir dem Spieler alle Funktionen damit er unserer QTE nicht abbrechen kann.
3) Als nächstes wollen wir dem Spieler aufmerksam machen das nun ein QTE startet. Ich nutze hierzu "Yanflys Gab Window". Mann kann sich hier seiner Kreativität freien lauf lassen.
4) Nun kommt der heikle Part bei diesem Event! Wir definieren nun unserer Erste Variable "QTE - System" was sie weiter reichen soll.
Diese Variable beinhaltet dabei 3 Einstellungen, diese ergeben sich aus dem TIMER der dem Spieler Zeit gibt. Die Button Anzahl die der Spieler drücken muss und ob der Fehlschlag zu einem Game Over (0 deaktiviert es und 1 aktiviert es) führt.
Ihr seit jetzt sicher verwundert warum hier aber eine 4 Einstellung vorhanden ist? Diese 0 sollte stehts 0 bleiben da sie unser Counter ist der auf die Button Anzahl hinauf zählt
Also habt ihr die Möglichkeit die Zeit, die Button Anzahl und ob ein GO (Game Over) erscheinen soll einzustellen. Das wären die ersten zwei "0" und die letzte "0". Die dritte "0" darf NIEMALS geändert werden da sonst der Counter nicht mehr passen würde
Um die Variable nicht abschreiben zu müssen hier der Code:
$gameVariables.setValue(1, [0, 0, 0, 0]);
Um euch es für später zu erleichtern. Das Programm sieht die erste Position immer als 0 an, die zweite wäre dann 1 und so weiter.
Sieht später dann so aus:
0 0 0 0 <- Script (Also das was wir sehen)
0 1 2 3 <- Engine Erkennung der Position
5) Zu guter letzt müssen wir nur noch unser QTE starten. Dazu fügen wir nun unseren Schalter hinzu.
Kommen wir nun zu dem wohl längerem Part bei dem ganzen
1) Als erstes erstellen wir uns wieder ein Common Event mit unserem ersten Schalter und auf Parallel.
2) Wir fügen uns als Kommentar noch eine kleine Hilfestellung ein, ob ihr das wollt oder nicht liegt in eurer Hand!
Des weiterem tönen wir unser Fenster ein wenig, auch das liegt ganz bei euch.
3) Da dies ein Parallel verlauf ist und immer wieder vom neuen startet können wir unseren Spieler dazu zwingen festzuhalten damit er nicht davon läuft. Das machen wir mit einer Bewegungsroute und einem Wait befehl.
4) Kommen wir nun zu unserer ersten Abfrage im System. Hierbei handelt es sich um die "Game Over" abfrage. Als erstes benötigen wir eine IF-Abfrage per Script und fragen in unserer ersten Variable "QTE - System" die Position 0 ab ob sie auf 0 steht. Wir erinnern uns zurück? Position 0 definierte unseren Timer wie lange das QTE laufen soll.
Die Abfrage sieht also folgend so aus:
$gameVariables.value(1)[0] <= 0;
In dieser Abfrage benötigen wir nun den "Bild löschen" befehl mit 1. Das sollte dann das letzte Bild löschen wenn es zu einem GO (Game Over) kommt.
Desweiteren schalten wir unser Event wieder ab mit unserem QTE-ON/OFF Schalter.
Nun brauchen wir wieder eine IF-Abfrage per Script und einem ELSE um abzufragen ob ein GO (Game Over) erscheinen soll oder nichts. Dies machen wir wie oben nur schaut der Befehl folgenderweise aus:
$gameVariables.value(1)[3] == 1;
In dieser Abfrage setzt ihr nun euer Game Over ein wie ihr das möchtet. In dem ELSE Abschnitt setzte ihr wieder eine Hintergrundmusik Ausblendung für 3 Sekunden ein. Auch unseren "QTE-FAIL" schalter fügen wir hier ein. Dieser Dient dazu um später wenn ihr das GO (Game Over) nicht braucht oder keinen Sinn ergibt abzufragen ob das QTE fehlgeschlagen ist.
Viel Text und viel Verwirrung xD Um euch das leichter zu machen habe ich auch hier ein Bild wie es nun aussehen sollte:
5) Nun brauchen wir unseren "QTE - RandomButton" um einen zufälligen Button erscheinen zu lassen. Dies erwirken wir mit der Ingame vorhanden Zufalls Zahl auswürfeln. Wir brauchen hier nur 0 - 3 da wir auf 4 Buttons aufbauen. Wenn ihr mehr nutzen wollt müsst ihr die Zahl natürlich erweitern. Dies erkläre ich hier aber nicht.
6) Nun kommt der Komplexe Teil den ich nun in zwei Varianten aufteile. Hier erkläre ich den Anfang!
Wir erstellen uns nun eine neue IF-Abfrage in der wir Abfragen ob der Timer noch über 0 steht. Wie auch oben wieder per Skript:
$gameVariables.value(1)[0] >= 1;
Weiter geht es mit dem nächsten Abschnitt!
Dieser Abschnitt ist genauso Komplex wie der obrigen, ich teile diese nur auf um es euch leichter zu machen da hier nun die Buttons definiert werden.
HINWEIS: Da dieser Abschnitt eine weiter Führung ist wird alles in der letzten IF-Abfrage geschrieben.
1) Wir definieren unseren ersten Button (A) YEAH!
Als ersten brauchen wir wieder eine IF-Abfrage, diese dient dazu um aus unserer Random generierten Zahl festzustellen welcher Button gemeint ist. Da wir Button A bauen werden wir die 0 dafür verwenden. Also nehmen wir nun die "QTE - RandomButton" Variable mit einer Konstante von 0.
2) Nun wollen wir dem Spieler aber auch wissen lassen welche Button gedrückt gehört oder? Genau! Wir lassen ein Bild erscheinen. Dazu braucht ihr ein Button Bild mit dem Buchstaben A darin. Wählt nun "Bild anzeigen" und definiert euer Bild so das es euch gefällt. Das Bild sollte die 1 tragen!
3) Nun brauchen wir eine "Schleife", diese soll ständig abfragen ob die Taste gedrückt wird oder nicht. Erstellt sie direkt unter dem Bild.
4) Um den Spieler daran zu hindern in der "Schleife" sich zu bewegen müssen wir ihn auch hier festhalten. Das machen wir wie oben beschrieben mit einer Bewegungsroute und einem Wait darin.
5) Als ob wir nicht schon genug davon haben setzen wir hier trotzdem wieder eine IF-Abfrage ein. Da wir am Anfang "A" mit "1" deklariert haben brauchen wir nun die Abfrage so das wir unsere Variable "Keybind" auf 1 abfragen. Diese Abfrage benötigt auch ein ELSE.
6) Nun wenn als "Keybind" = 1 ist dann hat der Spieler die Taste A gedrückt. Also fangen wir nun an zu definieren was geschehen soll. Als erstes werden wir dem Spieler wissen lassen das sein Tastendruck angenommen wurde mit einer kleiner Sound Ausgabe. Also setzen wir mal einen Sound, ich denke das brauche ich nicht erklären xD
Unter dieser Sound Ausgabe kommt definieren wir nun unsere Variable 1 (QTE - System) Abschnitt 2. Das ist unser Counter für die richtigen gedrückten Buttons. Also erstellen wir ein Skript Befehl mit folgendem Inhalt: $gameVariables.value(1)[2] += 1;
Nun löschen wir Bild 1 wieder und setzen unsere Variable "QTE - Keybind" wieder auf "0". Na was gemerkt? Aus diesem Grund darf 0 nicht belegt werden.
Als letzten Schritt unterbrechen wir nun unsere Schleife! Und sieh an wir haben unseren ersten Button erstellt der nun funktioniert.
ABER HALT! Was ist nun wenn der Spieler nicht diesen Button drückt? :O
Dazu haben wir unsere ELSE Abfrage! Nun wollen wir diese befüllen. Da wir wollen das der Time Counter um 1 Sekunde runter geht die der Spieler nicht drückt, setzen wir also wieder einen Skript Befehl und senken unsere Variable 1 (QTE - System) Abschnitt 0 mit: $gameVariables.value(1)[0] -= 1;
Um das ganze nun auch wirklich 1 Sekunde später wieder zu machen brauchen wir einen WAIT Befehl mit 60 Frames darunter.
Nun haben wir es geschafft den Button zu definieren und was passiert wenn der Spieler darauf drückt. Auch wenn der Spieler nichts tut das der Timer herab zählt. Aber nun brauchen wir auch in der Schleife was passieren soll wenn der Timer 0 erreicht weil der Spieler nichts machte.
Das erledigen wir wieder mit einer IF-Abfrage per Skript direkt unter dem WAIT Befehl.
Folgenden Befehl einfügen: $gameVariables.value(1)[0] <= 0;
In dieser IF-Abfrage unterbrechen wir einfach die Schleife wieder.
WUNDERBAR Unser erster vollfunktionierender Button klappt nun, hmm ... aber was ist wenn der Spieler den falschen drückt?
Ah ich habs!
7) Setzen wir unter unserer IF-Abfrage für den Button A (QTE - Keybind = 1) eine weitere IF-Abfrage für den Keybind. Dieses mal aber ob die Zahl höher als 2 ist. Hier ist es noch leicht da wir am Anfang sind.
In dieser Abfrage setzen wir einen Sound um dem Spieler zu vermitteln das er falsch gedrückt hat.
Danach folgt ein Skript Befehl der den Timer sofort auf 0 stellt um ein sofortiges beendet des QTE herbei zu rufen.
Der Befehl sieht so aus: $gameVariables.value(1)[0] = 0;
Dann erfolgt die zurück Stellung des QTE - Keybind auf 0.
Darunter wird die Schleife gebrochen.
So und das war nun unserer erster Button den wir eingebaut haben. Wir brauchen aber noch 3 weitere die ich abgekürzt im nächsten Abschnitt zeige.
HINWEIS: Dieser Abschnitt lehnt sich an den vorigen Abschnitt und ist verkürzt. Bei Verständnis Problemen schaue noch einmal in den vorigen Abschnitt nach.
1) Als erstes kopiert ihr euch den Abschnitt mit dem Button A und fügt ihn direkt unter der IF-Abfrage von Button A aber noch innerhalb der Time Abfrage.
2) Geht nun zum Anfang vom kopierten Abschnitt und erhöht die Konstante des "QTE - RandomButton" um 1
3) Als nächstes ändert ihr das Bild zum passenden Button.
4) Als nächstes kommt die Abfrage "QTE - Keybind" dran und wird auch erhöht um 1
5) Geht nun zur Abfrage "QTE - Keybind > 2" (Das ist die letzte die wir erstellt haben). Führt diese Abfrage nun als Skript aus mit folgendem Inhalt:
Dies erfragt ob die Variable "QTE - Keybind" eine andere Zahl zugewiesen bekommen hat was der fall sobald der Spieler eine andere Taste drückt. Da wir Taste S (Keybind 2) haben wollen brauchen wir 1, 3 und 4 nicht.
6) Wiederholt das ganze nun mit allen Buttons, ich hänge hier nun noch Bilder an um euch das richtige einstellen zu erleichtern
Keybind Variable laut Abschnitt 5 Button S:
Keybind Variable laut Abschnitt 5 Button D:
Keybind Variable laut Abschnitt 5 Button F:
Bald haben wir es keine Sorge
Nun müssen wir noch definieren was passieren soll wenn der Spieler alles richtig gedrückt hat. Wir erinnern uns, wir haben festgelegt wenn der Spieler einen Button richtig drückt das der System Counter nach oben zählt oder?
Also müssen wir nun schauen das wir eine Abfrage starten die uns vor dem Timer überprüft ob der Spieler die Anzahl erreicht hat die wir ihm vorgeben.
Das erledigen wir wieder mit einer einfachen IF-Abfrage im Skript teil Die folgender weise aussehen sollte:
$gameVariables.value(1)[1] == $gameVariables.value(1)[2];
HINWEIS: In dieser Abfrage darf nicht mehr in der obigen Abfrage drin stecken und muss ganz an das Ende gefügt werden.
Diese Abfrage können wir nun mir allem füllen was passieren soll wenn der Spieler das QTE gemeistert hat.
Als erstes sollten wir aber das Event wieder abschalten in dem wir unseren "QTE_ON/OFF Schalter abschalten.
Danach löschen wir unser Bild wieder.
Nun setzen wir unsere Keybind Variable wieder auf 0
Dann sollte unsere System variable resettet werden, das machen wir wieder mit jeweils einem Skript befehl:
$gameVariables.value(1)[2] = 0;
und
$gameVariables.value(1)[0] = 0;
zuletzt habe ich einen Wait mit 30 Frames eingebaut und lasse dann wieder die gespeicherte Hintergrund Musik abspielen.
Und noch ganz am Ende von all dem kommt noch ein Wait Befehl mit 1 Frame.
Und das war es schon
Nachtrag:
Verständlicherweise muss man das Menü wieder aktivieren nach Abschluss des QTE sowie das Bild wieder einblenden. Ihr solltet nun wissen wie das klappt
Ich würde mich über Feedback, Verbesserungen und Vorschläge freuen
Mfg
Sajiki