PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Tasten - System (quick time event)



raoh
14.11.2012, 14:40
Hey Leute

Ich probier grade ein QTE System umzusetzen. (2k3)

Soll heissen, vom Spieler wird verlangt eine gewisse Tasten Reihenfolge innerhalb eines gewissen Zeitfensters zu drücken. Für jede verlangte Taste hat man 2 Sekunde Zeit.
Drückt man eine falsche Taste, oder man ist zu langsam, hat man verloren. Drückt man die richtige Taste innerhalb des Zeitlimits geht’s mit der nächsten Taste weiter etc.
Wer Shenmue kennt kann sich das evtl. besser vorstellen :) ( http://www.youtube.com/watch?v=IgZZIrYoGL0 )

Mein Hauptproblem besteht momentan darin wie man das am besten löst mit dem Tastendrücken, bzw. wenn der Spieler eine falsche Taste drückt soll er ja quasi verlieren...
Muss man da jetzt jede mögliche (falsche) Taste in eine Variabel speichern?
Oder gibt’s da eine andere, bessere Lösung?
Bin für Anregungen dankbar!

DNKpp
14.11.2012, 16:05
hab mal eben was ausprobiert:

das ist das initial event. hier werden die variabeln gesetzt. die variabeln 10 + 11 geben den key (oben, dann links) an, der gedrückt werden soll. timer ist der timer der genullt werden soll. runden ist praktisch die anzahl, wie viele keys man nacheinander drücken soll. dann wird nen switch gesetzt, um das haupt event zu starten.
counter gibt an, wo ich die variabeln lager, die meine gewollten keywerte beinhalten. in diesem fall 10 (da auf variabel id 10 mein erster keywert liegt).

<> Change Variable: [10:key1] = 4
<> Change Variable: [11:key2] = 2
<> Change Variable: [4:timer] = 0
<> Change Variable: [5:counter] = 10
<> Change Variable: [7:runden] = 2
<> Change Switch: [1] = ON

hier frage ich zuerst die keys ab, die gedrückt sind. zuerst jedoch, ob der timer kleiner=20 ist. wenn ja, wird weiter geguckt, wenn nein, ist es vorbei, und startet neu, weil eben der switch wieder auf 0 gestellt wird.
als nächstes schaue, ich ob überhaupt ein key gedrückt wurde ( != 0). dann hole ich mir den wert von meiner momentanen keyvariabel (der wert von 5:counter, beim 1. durchlauf also variable id 10). den vergleiche ich dann mit dem key, der gedrückt wurde, wenn der richtig ist, gehts weiter, wenn nicht, wird ein false ausgegeben.
wenns richtig ist, wird counter um eins erhöht (um beim nächsten durchlauf eine andere variabel zu bekommen), runden mit 1 subtrahiert. danach wird geschaut, ob runden == 0. wenn das zutrifft, ist das spiel gewonnen und es startet neu.
ganz unten wird einfach ein wait mit 0.1sec gewartet, und danach der timer um 1 erhöht.

<> Key Input Processing: Var. [3], Keys: Down, Left, Right, Up
<> Fork Condition: If Variable [4] <= 20 then ...
<> Change Variable: [6:temp] = V[V[5]]
<> Fork Condition: If Variable [3:keystore] != 0 then ...
<> Fork Condition: If Variable [3:keystore] != V[2] then ...
<> Fork Condition: If Variable [3:keystore] == V[6] then ...
<> Change Variable: [4:timer] = 0
<> Change Variable: [5:counter] += 1
<> Change Variable: [7:runden] -= 1
<> Fork Condition: If Variable [7:runden] == 0 then ...
<> Show Message: win!
<> Change Switch: [1] = OFF
<>
: End of fork
<> Jump To Label: 1
<>
: Else ...
<> Show Message: false
<> Change Switch: [1] = OFF
<>
: End of fork
<>
: End of fork
<>
: End of fork
<>
: Else ...
<> Show Message: vorbei!
<> Change Switch: [1] = OFF
<>
: End of fork
<> Wait: 0,1 sec.
<> Change Variable: [4:timer] += 1
<> Label: 1
<> Change Variable: [2:keystorebefore] = V[3]



an sich würde ich das noch ein wenig anders gestalten (mehrere keywerte in eine variabel, und das ganze per modulo auflösen) aber ich wollte es einfach halten. hoffe ist verständlich, was ich meine ;)
hab das ganze auch mal angehängt.
willst du jetzt noch entsprechende richtungstasten auf dem bildschirm angezeigt haben, musst du die halt vor die tastenabfrage legen.

mfg

raoh
14.11.2012, 16:19
Genial!
Hab gester schon mal nach einem Skribt gesucht und nichts gefunden.
Muss das zuhause sofort unter die Lupe nehmen, danke dir :A

djeurissen
14.11.2012, 19:44
Ähm, ich habe mir das Skript oben nicht angekukt aber warum solltest du jede Taste einzelnd abfragen und abspeichern? Immerhin kommt es zu dem jeweiligen Zeitpunkt nur auf zb. A an und sagen wir mal A hat nun die Nummer 2. Nun gibt es eine Variable die die zuletzt gedrückte Taste speichert und abfragt ob die Variable = 2 ist ansonsten wird eben deine Konsequenz eingefügt.

Natürlich sollte man noch darrauf achten das der Spieler auch mal keine Taste drückt und so weiter, aber das ist eben der Grundgedanke...

DNKpp
14.11.2012, 20:53
wie willst du sonst eine comboline erstellen, ohne 20if bedingungen für jede comboline?

DNKpp
15.11.2012, 12:54
hab das nochmal ein wenig überarbeitet.
wenn man die taste mehr als 0.1 sec gehalten hat, wurde das automatisch schon als nächster input gewertet, was nich sein soll.
deswegen habe ich praktisch einen keybuffer angelegt, der mir die letzte taste speichert, die gedrückt wurde. wenn das die gleiche wie die jetzige ist, wird sie nicht gewertet.

naja, sollte wohl so stimmen jetzt ;)