Ich entwickle eine kleine 2D-Game-Engine. Die Zeichen haben eine Malmethode, die derzeit Folgendes ausführt:
- Berechnen Sie die neue Position des Charakters anhand seiner Geschwindigkeit usw.
- Aktualisieren der Kollisionsgitterzelle **
- Zeichne den Charakter an der neuen Position
** Ich habe ein Kollisionsraster erstellt, um die Anzahl der Kreuzungsprüfungen zu verringern
Nun ist der grundlegende Algorithmus, den ich zur Erkennung von Kollisionen gedacht habe:
For Each Character
Check intersection with characters in surrounding 8 cells
Ich kann diesen Code einfach in die Paint-Methode einfügen. Aber hier ist das Problem, das ich erwarte.
Angenommen, zwei Zeichen A und B liegen in benachbarten Zellen des Kollisionsgitters. Nun wird gemäß dem obigen Algorithmus bei der Iteration von Zeichen A festgestellt, dass es mit B kollidiert ist. Bei der Iteration von Zeichen B wird festgestellt, dass es mit A kollidiert ist.
Aber ich habe die Idee, dass wenn A feststellt, dass es mit B kollidiert ist, es B mitteilen sollte, dass es mit A kollidiert ist. Dies würde viele Vergleiche ersparen, wenn mehr als 2 Akteure kollidieren. Aber ich bin mir nicht sicher, wie ich damit umgehen soll. Ich denke, anstatt dass jeder Charakter nach seiner Kollision sucht, sollte ich innerhalb der Spielschleife nach der Kollision suchen.
Wäre dieser Ansatz richtig? Wie haben Sie mit solchen Problemen umgegangen? Ich habe selbst an das Kollisionsgitter gedacht. Gibt es Alternativen zur Kollisionsgitterlogik?
Antworten:
Der übliche Ansatz für die Kollisionserkennung besteht darin, dass weder A noch B selbst Kollisionen erkennen.
Stattdessen verschieben Sie zuerst alle Objekte, lassen dann in einem separaten Kollisionssystem nach Kollisionen zwischen allen Objektpaaren suchen, wobei Sie jedem Objekt mitteilen, mit welchen Dingen es kollidiert hat, und anschließend alle Objekte rendern.
Anstatt also in Ihrer Paint () -Funktion "Verschieben, auf Kollisionen prüfen, Zeichnen" auszuführen, teilen Sie "Verschieben" und "Zeichnen" in separate Funktionen auf, die Sie separat aufrufen (zuerst "Verschieben" für jedes Objekt, dann "zeichnen" für jedes Objekt). Und dazwischen auf Kollisionen prüfen.
Hinweis für Fortgeschrittene: Wenn sich eines Ihrer Objekte als Reaktion auf erkannte Kollisionen von selbst bewegt, müssen Sie möglicherweise den Schritt "Nach Kollisionen zwischen allen Objektpaaren suchen" wiederholen, falls die Kollisionsreaktion eines Objekts eine weitere Kollision verursacht.
quelle
Ich starte eine Schleife für alle meine Charaktere in der Spieleschleife, wie Sie sagen.
Die Art und Weise, wie ich das mache, ist mit einem Status für jeden meiner Charaktere verbunden. Wenn also A und B kollidieren, während A die Kollision überprüft, sind A und B auf Treffer eingestellt. am anfang der schleife von b wird geprüft, ob die schleife bereits getroffen wurde, sonst wird die schleife nicht ausgeführt.
Ich habe den Affect-Code in die Schleife eingefügt, damit in der Schleife von A alle Aktionen ausgeführt werden, die für B ausgeführt werden sollten. Es sollte also keinen Grund für B geben, dies zu überprüfen, da dies das Ergebnis der Kollision verfälschen würde. Dies kann jedoch für Sie anders sein .
quelle