Replay - Funktion bei Spielen

  • Allgemein

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von bsHobbit.

    Replay - Funktion bei Spielen

    Hallo allerseits,

    ich programmiere gerade ein Billard-Spiel, bin mit dem eingentlichem Programm schon fertig.
    Nun soll ich eine Replay-Funktion einbauen:
    Es soll einen Aufnahmebutton geben, mit dem man die Aufnahme startet und in eine Datei speichert,
    später werden die Daten dann ausgelesen.

    Das einfachste wäre, wenn ich die Maus-Koordinaten nachbilden könnte, dann müsste ich nur die Anfangsposition
    der Kugeln und dann die Maus-Koordinaten mit einem Timer speichern.

    Kann man die Maus eigentlich über das Programm steuern? Wie würdet ihr das Replay machen?

    Danke im Voraus
    mfg
    Achim

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „DaMasta“ ()

    bsHobbit schrieb:

    Sorry, wenn das hier nichts mit deinem Problem zu tun , aber ich hätte mal 2 Fragen ^^

    1. Handelt es sich um 2D ?
    2. Wenn ja, wie hasst du die Kollision zwischen 2Kugeln und die Kollision zwischen kugel -> Feld berechnet ?
    Kein Problem, hier die Antworten:
    1. Ja es handelt sich um 2D
    2. Hab da ein Beispiel im Internet gefunden, eine Menge Vektorrechung: gymnasium-walldorf.de/mathemat…toss/elastischerstoss.htm

    a und b hab ich mir selbst ausgedrückt:
    a:
    b:
    ich hab mit shapes gearbeitet (VB6 wegen der Schule) wenn sich zwei kugeln berühren, werden sie voneinander abgestossen (wie oben):

    VB.NET-Quellcode

    1. Function Abstand_Kugeln(ByVal shp1 As Shape, ByVal shp2 As Shape) As Double
    2. Dim dblXm1, dblXm2, dblYm1, dblYm2, dblR1, dblR2 As Double
    3. dblR1 = CDbl(shp1.Width) / 2
    4. dblR2 = CDbl(shp2.Width) / 2
    5. dblXm1 = CDbl(shp1.Left) + dblR1
    6. dblYm1 = CDbl(shp1.Top) + dblR1
    7. dblXm2 = CDbl(shp2.Left) + dblR2
    8. dblYm2 = CDbl(shp2.Top) + dblR2
    9. Abstand_Kugeln = Betrag(dblXm1 - dblXm2, dblYm1 - dblYm2) - dblR1 - dblR2
    10. End Function


    mfg
    Achim
    Jetzt stell ich mir folgende Situation vor (siehe Bild)

    Die rote Kugel ausgefüllt ist vor der Bewegung.

    nach der bewegung (rote kugel unausgefüllt)

    Quellcode

    1. Pos.X += Geschw.X
    2. Pos.Y += Geschw.Y


    Ist die Kugel THEORETISCH hinter der blauen Kugel, aber auf dem Weg ist ja eine Kollision passiert, was dein algorithmus garnich mitbekommen hätte...

    hoffe du hast verstanden was ich mein ^^
    Bilder
    • kugel.png

      6,5 kB, 442×214, 102 mal angesehen
    Hi!

    Ich würde das Replay so machen, dass jedes mal, wenn ein Spieler schießt der Winkel und die Kraft (über die du das vermutlich rechnest?!) in eine Datei angefügt werden.

    Quellcode

    1. Spielernummer;Kraft;Winkel
    2. 1;100;123
    3. 2;60;50
    4. 1;80;135
    5. etc..

    Mad Andy schrieb:

    Hi!

    Ich würde das Replay so machen, dass jedes mal, wenn ein Spieler schießt der Winkel und die Kraft (über die du das vermutlich rechnest?!) in eine Datei angefügt werden.

    Quellcode

    1. Spielernummer;Kraft;Winkel
    2. 1;100;123
    3. 2;60;50
    4. 1;80;135
    5. etc..
    Danke für die Antwort, ich habs jetzt einfach so gemacht, dass ich mir alle Koordinaten speichere (ist denk ich am einfachsten). Dann hab ich einfach den mainTimer für mein Spiel gesperrt, die Daten aus der Datei ausgelesen und die Kugeln, sowie Queue verschoben. Bei einer Frequenz von 25Hz bzw. 40ms kommt das menschliche Auge nicht mehr mit. Ein Stoss dauert max. 10 Sek, ergibt 250 Aufnahmen --> die Datei wird also nie größer als 100kB (je nach Kugelanzahl)

    Wenn jemand weiß wie man solche Replay-Aufgaben besser lösen kann, bitte trotzdem schreiben!

    Nochmals Danke
    Achim

    bsHobbit schrieb:

    Jetzt stell ich mir folgende Situation vor (siehe Bild)

    Die rote Kugel ausgefüllt ist vor der Bewegung.

    nach der bewegung (rote kugel unausgefüllt)

    Quellcode

    1. Pos.X += Geschw.X
    2. Pos.Y += Geschw.Y


    Ist die Kugel THEORETISCH hinter der blauen Kugel, aber auf dem Weg ist ja eine Kollision passiert, was dein algorithmus garnich mitbekommen hätte...

    hoffe du hast verstanden was ich mein ^^
    Hab verstanden was du meinst, du hast Recht mein Algorithmus berücksichtigt eine solche Situation nicht. Diese Situation tritt aber auch nur auf wenn die Geschwindigkeit so hoch ist, dass der Timer nicht mehr mitkommt: Ich hab einen Interval von 1ms und komm damit ganz gut zurecht. Bei meinem Spiel muss man die weiße Kugel mittels Queue bzw. Mouse anstossen (nicht aufziehen und dann wird mit Klick geschossen). Meine Kugeln haben ein Durchmesser von 30px. Man müsste also 30px in 1ms zurücklegen um über das Ziel hinauszuschießen.
    Bei mir klappt das so jedenfalls ganz gut.
    Wen du es genau haben wolltest müsstest du nach meiner Theorie die Position beim letzten Timeraufruf der beiden Kugeln speichern und dann zurückinterpolieren. Selbst dann wirds nicht ganz genau (Lineariät usw.) - Außerdem steckt eine Menge Denksport und Tippen dahinter.

    Hoffe du hast verstanden was ich mein ?(
    Hi!

    1. Bitte Doppelposts vermeiden. 20 Minuten unterschied ist ja nicht so viel ...
    2. Den Beitrag, der direkt drüber steht musst du nicht zitieren, und statt ganze Beiträge zu zitieren, sollte man nur das zitieren, worauf man sich bezieht (ein paar Sätze)

    Wenn jemand weiß wie man solche Replay-Aufgaben besser lösen kann, bitte trotzdem schreiben!
    In Warcraft3 wird das so ähnlich gelöst, wie ich gesagt hab: Es wird jede Aktion mit einem Timestamp gespeichert. "SpielerX: EinheitY von A nach B zum Zeitpunkt Z"
    Dazu kommt dann noch die Kamerabewegung - da weiß ich nicht genau, wie die gespeichert wird, die fällt bei dir aber sowieso weg.

    Man müsste also 30px in 1ms zurücklegen
    Timer mit einem Interval von 1 funktionieren nicht. Diese sind a) ungenau und b) meistens um einiges größer als 1ms.
    Ist doch aber kein Problem 30px in 1ms zurück zu legen.

    Man hat seine Kugel, auf die wirkt eine Kraft F ein. Durch diese Kraft bekommt diese Kugel eine Geschwindigkeit in X und Y Richtung, diese Kraft könnte sich durchaus in 40px auswirken, es sei denn man stellt die Maximale Geschwindigkeit einer Kugel auf 30px, damit könnte man dieses Problem umgehen.

    Eine alternative wäre mit Ortsvektoren und Projektion den Zeitpunkt einer Kollision zu berechnen, wo ich noch keinen gescheiten algorithmus gefunden habe.


    @Topic

    Wenn du lediglich die Aktion des Spielers speichern willst, reicht tatsächlich Winkel und Kraft speicherst. Wenn du aber später auch noch evt die Mausbewegungen mit drin haben möchtest, solltest du auch dort einige Koordinaten speichern (nicht alle, man kann ja interpolieren).