Replay a la Quake

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

r.henson

Betreff: Replay a la Quake

BeitragMo, Apr 05, 2004 19:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo, ich möchte in meinem Spiel eine Replay-Option einbauen.
(also eine Spiel-Sequenz zu einem späteren Zeitpunkt noch einmal - quasi offline - wiedergeben können.
Dazu hatte ich mir erst überlegt alle Eigenschaften (wie Position, Rotaiton...) aller Objekte einer Szene pro Frame zu speichern, und dann einfach ablaufen zu lassen.
Mein Problem: das sind viel zu viele Informationen. Eigentlich müßte ich doch auch nur die Veränderungen speichern (a la Keyframes) und zwischen einem Zustand A eines Obejekts und einem Zustand B interpolieren.....
Aber wie erhalte ich 1. nur die Veränderungen
und 2. wie errechne ich Quasi einen Kurvenverlauf a la Bezier-Kurve.

Für etwaige Anregegungen oder Links wäre ich dankbar.
Mfg R.
 

Ava

Gast

BeitragMo, Apr 05, 2004 20:20
Antworten mit Zitat
Hm. Vielleicht könntest Du es auch so machen, dass Du einfach nur alle Kommandos speicherst á la Script?

Also Beispiel: (Pseudo-Script Wink)
    Spieler 1 läuft 20 Frames
    Spieler 1 dreht sich 90°
    Spieler 1 feuert
    usw


Das ist natürlich nicht ganz einfach, so ein Script 'on the flow' zu erstellen, wäre jetzt aber auf die Schnelle meine einzige Idee alternativ zur "alles speichern" Variante.
  • Zuletzt bearbeitet von Ava am Di, Apr 06, 2004 0:43, insgesamt 2-mal bearbeitet

Vincent

BeitragMo, Apr 05, 2004 22:49
Antworten mit Zitat
Benutzer-Profile anzeigen
hallo !

ich würd das so machen, das die bewegung des spielers und das schiessen+springen jeweils in einzelnen "scripts" gespeichert werden.

beim bewegen-script wir einfach immer jede volle sekunde ein "screenshot" vom spieler gemacht (position/drehung etc ..). dieser wird dann im replay in bewegung umgewandelt.

mit dem schiessen würd ich das so regeln, das in einem text alle events wie z.B. schüsse oder springen von spielern steht, und den jeweiligen events immer zeiten in millisec() zugewiesen sind.
wenn jetzt die replay-funktion eine bestimmte zeit läuft, dann wird das event ausgeführt (z.B. spieler schiesst).

schwierig wirds aber immernoch mit der synchonisation der vorgänge: z.B. der spieler schaut nur schnell (weniger als 1 sec) hinter ner wand vor und schiesst kurz ... da müsste man dann die zeitschritte bei der aufnahme der bewegung verfeinern.


damit ein spieler im replay auch noch immer den gegner trifft, den er im richtigen spiel getroffen hat, würde ich in die eventdatei noch reinschreiben, wer/wo/wann getroffen wurde.
Gott ist nicht mit uns ... weil er mit Idioten keine Gnade kennt !
 

Edlothiol

BeitragDi, Apr 06, 2004 12:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du keine Zufallszahlen verwendest, könntest du auch einfach die Tastendrücke speichern, das könnte jedoch ein bisschen unsicher sein wegen Float - Fehler etc., ich habs noch nie ausprobiert.
 

Black

BeitragDi, Apr 06, 2004 12:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Quake basiert auf einem strikten Server-Client-Prinzip, d.h. selbst im Multiplayer wird ein lokaler Server gestartet.

Die Demo-Recording Funktion macht nichts anderes als die Netzwerk Messages abzuspeichern (- ich glaube sowohl die, die an den Server geschickt werden als auch jene, die vom Server an den Client geschickt werden).
Dadurch läßt sich eine Multiplayer Spiel 1:1 ohne sehr viel mehr Aufwand recorden.

cu Black
 

Ava

Gast

BeitragDi, Apr 06, 2004 12:54
Antworten mit Zitat
Edlothiol hat Folgendes geschrieben:
Wenn du keine Zufallszahlen verwendest...


Das ist so nicht ganz richtig: Jede Kette von Zufallszahlen kann rekonstruiert werden! dafür gibt es den SeedRnd() Befehl... fütter den Generator mit der selben Zahl und Du erhälst auch anschliessend die selebe Reihenfolge von Zufallszahlen.
 

norc

BeitragDi, Apr 06, 2004 13:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Was Ana sagt, ist absolut korrekt, die Zufallssequenz kann reproduziert werden, wenn man RNDSEED vor dem Spiel/Replay mit einem fixen Wert setzt.

Wenn es single player ist, kann man eigentlich bloss die User aktionen (Mouse Speed, tasten usw., was eben verwendet wird) aufzuzeichen. Wenn es Multiplayer ist, muss man wie gesagt wurde, die Aktionen aller Player berücksichtigen.

Es gibt aber ein anderes Problem beim Abspielen von IO Recordings: Wenn das Spiel mit variabler Framerate arbeitet, bekommt man unweigerlich Probleme.

Möglich wäre Realtime Sequencing, d.h. mit jeder Useraktion speichert man auch den Zeitpunkt. Wenn man alle Abläufe des Spiels ebenfalls echtzeit-korrigiert laufen lässt, dann sollten die beiden Dinge koordiniert ablaufen. Allerdings bin ich mir nicht sicher, ob die Zufalls-Sequenz dann immer noch korrekt wiedergegeben wird (?)

Echtzeit Sequencing sieht etwa so aus:

Code: [AUSKLAPPEN]

dim rec(10000,10)
dday=millisecs()

; play
while game
 if keydown(200)
  ; bewege player wie üblich
  rec(count,0)=millisecs()-dday
  rec(count,1)=1 ; merke taste
  count=count+1
 endif
wend

; replay
dday2=millisecs()
count2=0
while replay
 if millisecs()>=(rec(count2,0)+dday2)
  if rec(count2,1)=1 ; keydown(200)
   ; bewege player wie üblich
  endif
  count2=count2+1
  if count2>count then replay_beenden
 endif
wend
 

r.henson

BeitragMi, Apr 07, 2004 10:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Dank an allle. Habe mittlerweile selbst noch dieses Tutorial auf BLITZCODER entdeckt. Geht in die von Euch beschriebene Richtung.



http://www.blitzcoder.com/cgi-...23515.html

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group