Ich entwickle ein Spiel, in dem Spieler mit Seilen schwingen können (genau wie Spiderman oder Bionic Commando ), und ich habe Probleme, dieses Verhalten zu implementieren. Kann mir jemand helfen, wie das geht, ich meine Physikformeln und so weiter. Bis jetzt habe ich 3 Ideen. Man benutzt den Frühling, aber er verbraucht viel Zeit und manchmal ist er nervös. Die anderen beiden versuchen, den nächsten Schritt zu berechnen (einen über die Berechnung der potentiellen Energie und einen über die Berechnung des Drehmoments), und beide stürzen fast ab, wenn der Schauspieler versucht zu schwingen.
Hier ist der Code, den ich geschrieben habe, um das Drehmoment zu berechnen:
float dx = Runner->getPosition().x - ancher.x;
float dy = Runner->getPosition().y - ancher.y;
float t0 = atan2(dy,dx); //my current angle
float k = ((dy) *vx - (dx) * vy) / (dx * dx+dy * dy); //previus angular velocity
k -= gravity * cos(t0) *dt; // new angular velocity (gravity is positive)
t0 += k * dt - acc * cos(t0) *dt * dt / 2; // rotate the rope
float dx1 = r0 * cos(t0); // new position (r0 is rope length)
float dy1 = r0 * sin(t0);
vx = (dx1 - dx) / dt; //calculate velocity
vy = (dy1 - dy) / dt;
physics
platformer
rope-physics
Ali1S232
quelle
quelle
Antworten:
Wenn Sie einen starren Schwung wünschen, damit der Abstand zum Drehpunkt konstant ist, behandeln Sie das Zeichen einfach als einen Punkt auf einem Kreis, der am Drehpunkt zentriert ist. Geben Sie ihm eine eindimensionale Winkelgeschwindigkeit (entlang des Kreises). In jedem Frame sollte die Winkelbeschleunigung sein
accelerationDueToGravity * cos(angleOfPlayerOnCircle)
(wobei 0 Grad nach rechts zeigen).Wenn Sie möchten, dass das Seil länger / kürzer wird, können Sie das obige Schema verwenden und einfach den Radius jedes Rahmens variieren.
quelle
Nach vielen Versuchen ging ich mit box2d.
Es gibt im Allgemeinen zwei Ansätze für diese Simulation oder zumindest habe ich 2 gefunden:
In jedem Szenario muss man einen Ancher haben (was in meinem Fall eine statische Box war). Es ist besser, wenn Sie das Gewicht der Seilteile verringern (entweder verwenden Sie Kreisformen oder Rechteckformen). Um beispielsweise eine realistischere Physik zu erzielen, habe ich deren Dichte auf 0,1 eingestellt und für die am Ende des Seils angeschlossene Box die Dichte 10 verwendet.
Eine andere Sache, die Sie sich Sorgen machen müssen, wie Ihr Seilsegment aufeinander reagiert. Ich wollte nur, dass sich mein Seil in der Szene frei bewegt, also markierte ich alle Seilbefestigungen als Sensoren. Möglicherweise benötigen Sie einen anderen Ansatz.
Das nächste, worüber Sie sich Sorgen machen müssen, ist die Anzahl der Iterationen, die Sie für das Welt-Update durchführen: Für ein niedriges Seilsegment (möglicherweise höchstens 8) ist es nicht erforderlich, einen hohen Iterationswert zu verwenden, möglicherweise 10/10, den box2d selbst vorgeschlagen hat ist genug, aber wenn Sie die Anzahl der Segmente erhöhen, habe ich zum Beispiel 30 Segmente ausprobiert. Bei einer geringen Anzahl von Iterationen scheint Ihr Seil die Länge mehr zu erhöhen, als es sollte. Sie benötigen also möglicherweise 40/40 Iterationen, um diese Situationen zu lösen.
Nach einigen Tests scheint Box 2d für Szenen mit Objektgrößen von 0,1 m bis 10 m ausgelegt zu sein, und die für große Szenen empfohlene maximale Größe liegt bei etwa 50 x 50 m. Grundsätzlich müssen Sie Ihr Objekt verkleinern, um diesen Parametern zu entsprechen. In meinem Fall habe ich zuerst versucht, Pixelpositionen direkt an box2d zu übergeben, aber es schien, als gäbe es einige Geschwindigkeitsbegrenzungen, die verhindern, dass sich die Welt so schnell bewegt, wie es sein sollte. Deshalb musste ich meine Szene ungefähr 64 Mal skalieren, um die besten Ergebnisse zu erzielen. Obwohl ich mich nicht selbst getestet habe, gibt es in Box2d einige Einschränkungen, die Sie daran hindern, größere Szenen zu verwenden. Zum Beispiel gibt es einen definierten Wert in der
b2Setting.h
Datei, mit dem#define b2_maxTranslation 2.0f
Sie die Einstellungen für box2d ändern können, der jedoch nicht empfohlen wird.quelle
Haben Sie darüber nachgedacht, die Geschwindigkeit der Schwungbewegung zu verlangsamen, je nachdem, wie weit das Seil von der Lotlinie (der Mitte) entfernt ist?
quelle
Wenn der Spieler weiter als die Länge des Seils ist, wird der Spieler sofort mit einer Kraft zurückgeschoben, die der Entfernung entspricht, die er passiert hat. Dies sollte funktionieren, ohne sich federnd zu fühlen, und sollte sich für den Spieler intuitiv anfühlen. Möglicherweise müssen Sie Ihre Physik optimieren, um die besten Ergebnisse für Ihr Spiel zu erzielen.
Wenn das Seil befestigt ist. Speichern Sie einen
maxLength
Wert.Überprüfen Sie bei jedem Update das
distance
zwischen demplayer
und demattachPoint
Wenn das
distance
weniger als dasmaxLength
Update normalerweise ist, keine Auswirkungen von Seil.Wenn der Abstand größer als der ist
maxLength
, suchen Sie dennormal
vomattachPoint
zum Spieler. Holen Sie sich den Unterschied zwischendistance
undmaxLength
. Addiere zuplayerVelocity
,normal
multipliziert mit der Differenz.Pseudocode:
quelle
dx = player.x - attachpoint.x
und habendy = player.y - attachpoint.y
.Wenn Sie sich http://www.cocos2d-iphone.org/archives/1112 ansehen gibt es eine Implementierung eines Seils mit einem starren Körper, der am Ende des Seils befestigt ist. Es verwendet Box2D für die Physik-Engine. Wenn Sie sich den Quellcode ansehen, können Sie ihn sicher in einer beliebigen Sprache implementieren.
Der obige Link zur Rope-Frage gehört mir und diese Demo (Link oben) hat wirklich geholfen.
quelle