Ich entwickle gerade einen Top-Down-Echtzeit-Zombie-Shooter. Ich codiere dies in Java und verwende JBox2D als meine Physik-Engine. Ich habe diese Woche das Netzwerk codiert und bin jetzt mit der Synchronisation der Physik beschäftigt.
Ich plane, das Predictive Client / Authoritative Server-Modell zu verwenden, bei dem sich der Client frei bewegen kann, solange der Server dies später genehmigt. Dies beinhaltet, dass der Client Pakete mit Bewegungsdaten an den Server sendet und der Server die Latenz berechnet und die Welt aus einem älteren Zustand neu simuliert.
Mein Problem ist, dass meine aktuelle Physik-Engine, JBox2D (im Grunde ein Port von Box2D), das Zurückrollen der Welt nicht unterstützt und es anscheinend nicht so einfach ist, die Weltdaten zu serialisieren. Ich habe 2 Lösungen, ich könnte entweder meine aktuelle Physik-Engine modifizieren / erweitern oder meine eigene schreiben.
Gründe für das Schreiben meiner eigenen Physik-Engine -
- Ich kann unnötige Funktionen entfernen. In einem Top-Down-Spiel brauche ich nur Kollisionsmechanik und Handhabungskräfte. Es ist keine Schwerkraft beteiligt.
- Ich kann den Code besser verstehen und es wäre [höchstwahrscheinlich] einfacher, Rollback-Funktionen zu implementieren
Gründe für die Erweiterung / Änderung von JBox2D
- Das Schreiben meiner eigenen Physik-Engine wäre ein erheblicher Arbeitsaufwand, der umständlich sein könnte
- JBox2D hat eine breite unterstützende Community, die mir bei meinem Entwickler helfen kann
- JBox2D verfügt über spezifische Optimierungen für Dinge wie die Kollisionserkennung, die es nützlich machen
- Einige Arbeiten wurden bereits durchgeführt, aber es wurde nur wenig Code freigegeben
Also, was sind deine Meinungen. Dies ist mein erstes Spiel und ich bin kein professioneller Spieleentwickler. Wenn jemand einige Links zu Arbeiten bereitstellen könnte, die bereits in der Region ausgeführt wurden (vorzugsweise mit JBox2D / Box2D / Java).
quelle
strictfp
überall verwenden müssen, da dies die Leistung erheblich beeinträchtigt. Andernfalls erhalten der Server und der Client möglicherweise nicht genau die gleichen Ergebnisse. Ich würde empfehlen, stattdessen einen festen Punkt zu verwenden.Antworten:
Die Kollisionserkennung in 2D ist so verdammt einfach, dass ich nicht weiß, warum Sie sich überhaupt die Mühe machen würden, eine Physik-Engine zu verwenden. Und da alle Handhabungskräfte direkt oder in einer Kurve sind (kein Sturz, keine Änderung der Diagnosen usw.), ist es für mich persönlich ein Kinderspiel, das Sie auswählen sollten. Eigenes zu machen ist einfach. Kollision:
Berücksichtigen Sie die 3 möglichen Kollisionen, die in 2 Rechtecken auftreten können:
EDIT: Wie kommentiert, bin ich mit dieser Angelegenheit weit weniger vertraut und sollte nicht über die Kugel- / Projektilkollision konsultiert werden.
Wenn ich mit Kugeln im 2D-Raum gearbeitet habe, habe ich eine Art Pfad verwendet, der sowohl in gerader als auch in gekrümmter Richtung funktioniert, wobei ich das Projektil mit der Physik-Engine (die ich nicht von Grund auf neu erstellt habe) geworfen und eine Standardkollision verwendet habe.
Lesen Sie in den Kommentaren, wie Sie dies von Grund auf neu erstellen.
BEARBEITEN: * Vertrau mir, * unabhängig davon, welche du brauchst, wird in deiner Spiele-Engine eine Form der toten Rechnung benötigt, wegen der Projektile und wie viele Projektile zu einem bestimmten Zeitpunkt auf dem Bildschirm sein könnten. Sie möchten ABSOLUT nicht jede einzelne Kugel auf dem Bildschirm pro Frame an der angegebenen Position aktualisieren. Aber es ist eine großartige Möglichkeit, ein Spiel unspielbar langsam zu machen: D! Sie sollten immer nur diese Dinge aktualisieren:
Aktualisieren Sie nun die Daten in der Engine entsprechend diesen Daten und nicht auf dem Server für jedes verdammte Projektil und senden Sie Paketdaten für jede einzelne Kugel aus. (Stellen Sie sich vor, Sie machen das mit nur 2 Maschinengewehren auf dem Bildschirm! Jesus!)
quelle