2017-04-26 1 views
0

Ich fange an, ein 2D-Spiel zu bauen und habe etwas Verwirrung um, ob ich Rotation in der Update-Funktion oder der Render-Funktion durchführen sollte.Führen Sie 2D-Vertices Rotation in Update-Funktion oder Render-Funktion

Das Problem ist das;

Ich habe ein Dreieck, bestehend aus drei Ecken. Das Dreieck hat einen Rotationswert in Grad.

Wenn ich die Scheitelpunkte in der Update-Funktion rotiere, dreht sich das Dreieck für immer, da jedes Update die Drehung immer wieder anwendet.

Daher entschied ich mich, die Vertices in der Update-Funktion nicht zu rotieren und stattdessen die Rotation basierend auf den ursprünglichen Vertices in der Render-Funktion durchzuführen.

Das funktioniert, aber jetzt habe ich ein anderes Problem. Die Ecken sind nicht wirklich dort, wo sie zu sein scheinen. Daher kann ich die Scheitelpunkte nicht verwenden, um eine Kollisionserkennung usw. durchzuführen.

Die einzige Idee, die ich lösen muss, ist, dass ich die Drehung in der Update-Funktion ausführen kann, aber zwei Scheitelpunkte habe; eine für die ursprünglichen Scheitelpunkte, eine der gedrehten Scheitelpunkte. Dann benutze die gedrehten Ecken in den Kollisionserkennungsberechnungen - das riecht hacky und ineffizient!

Ich habe einen Codepen zusammengebaut, der das Anwenden der Drehung in der Wiedergabefunktion demonstriert; https://codepen.io/anon/pen/pPRjLq

Use arrow keys to rotate 

So sollte ich drehen machen oder aktualisieren? Wenn rendern dann wie halte ich Scheitelpunkte auf dem neuesten Stand? Wenn update dann wie verhindere ich unendliche Rotationen?

Jede Hilfe von erfahrenen Menschen würde sehr geschätzt werden - danke!

Antwort

0

Lassen Sie die Rotation in der update Methode auftreten, während Sie die Rotation des Aktors aktualisieren.

Sie müssen sich auch nicht an zwei Scheitelpunkte erinnern, es wäre eine bessere Alternative, nur die aktuellen Scheitelpunkte des Aktors und die Drehung im Bogenmaß zu haben, ursprüngliche Scheitelpunkte müssen nicht gespeichert werden.

Vorausschauend sollte die Kollisionserkennung nicht von den Positionsvektoren eines Aktors abhängig sein, besser noch, dafür muss stattdessen ein Rechteck/AABB definiert werden, das bei Rotation auf den Aktor aktualisiert/skaliert werden müsste .

Wenn Sie eine benutzerdefinierte AABB zur Erkennung verwendet haben, könnte sie standardmäßig auf die Position des Aktorvektors gesetzt werden, aber durch Aufteilen der Konstrukte öffnet sich eine Menge Potenzial, z. B. Ändern der Schauspielertreffergrenzen x/y/width/Länge zur Laufzeit; es sollte nicht mit dem Akteur x/y/width/height gekoppelt sein, der sich auf die grafische Darstellung beziehen sollte.

Um die unendliche Drehung zu stoppen, könnten Sie eine boolean haben, um anzugeben, ob die Taste links oben und eine ähnlich für die richtige Taste und etwas wie unten;

update(delta) { 

    if(keyLeftDown) { 
     // apply rotation as rotation * delta/desiredFPS 
    } else if (keyRightDown) { 
     // 
    } 
} 

Hoffe, das hilft.

Verwandte Themen