Je suis en train de développer un jeu dans lequel le joueur peut utiliser des cordes pour se balancer (tout comme ce que Spiderman ou Bionic Commando ont fait) et j'ai des problèmes pour implémenter ce comportement. Quelqu'un peut-il m'aider à faire cela, je veux dire des formules de physique et etc. Jusqu'à maintenant, j'ai trouvé 3 idées. L'un utilise le printemps, mais il consomme beaucoup de temps et parfois il est nerveux. Les deux autres tentent de calculer la prochaine étape (l'une via le calcul de l'énergie potentielle et l'autre via le calcul du couple) et les deux se bloquent presque chaque fois que l'acteur essaie de se balancer.
Voici le code que j'ai écrit pour calculer le couple:
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
la source
la source
Réponses:
Si vous voulez un swing rigide, de sorte que la distance au point de rotation soit constante, il suffit de traiter le personnage comme un point sur un cercle centré au point de rotation. Donnez-lui une vitesse angulaire unidimensionnelle (le long du cercle). Pour chaque image, l'accélération angulaire doit être
accelerationDueToGravity * cos(angleOfPlayerOnCircle)
(avec 0 degrés pointant vers la droite).Si vous voulez que la corde soit plus longue / plus courte, vous pouvez utiliser le schéma ci-dessus et varier simplement le rayon de chaque cadre.
la source
après de nombreuses tentatives, je suis allé avec box2d.
il y a généralement deux approches pour cette simulation ou du moins j'en ai trouvé 2:
dans chaque senario, vous devez avoir un ancre (qui dans mon cas était une boîte statique). il vaut mieux que vous diminuiez le poids des pièces de corde (que vous utilisiez des formes de cercle ou des formes de rectangle), par exemple pour avoir une physique plus réaliste, je règle leur densité à 0,1 et pour la boîte connectée à l'extrémité de la corde, j'utilise la densité 10.
une autre chose que vous devez vous soucier de la façon dont votre segment de corde réagit les uns aux autres. Je voulais juste que ma corde bouge librement dans la scène, j'ai donc marqué tous les appareils de corde comme capteurs. vous pourriez avoir besoin d'une approche différente.
la prochaine chose dont vous devez vous soucier est le nombre d'itérations que vous passez à la mise à jour mondiale: pour un segment de corde bas (peut-être 8 au plus), il n'est pas nécessaire d'utiliser une valeur d'itération élevée, peut-être 10/10, ce que box2d lui-même a suggéré est suffisant, mais si vous augmentez le nombre de segments, par exemple, j'ai essayé 30 segments, avec un faible nombre d'itérations, votre corde semble augmenter sa longueur plus qu'elle ne devrait, donc vous avez peut-être besoin de 40 à 40 itérations pour résoudre ces situations.
après quelques tests, il semble que la boîte 2d est conçue pour les scènes avec des tailles d'objet de 0,1 m à 10 m et la taille maximale suggérée pour les grandes scènes est d'environ 50 mx 50 m. Donc, fondamentalement, vous devez réduire votre objet pour correspondre à ces paramètres. dans mon cas, j'ai d'abord essayé de passer les positions des pixels directement à box2d mais il semblait qu'il y avait des limites de vitesse empêchant le monde de bouger aussi vite qu'il le devrait, j'ai donc dû redimensionner ma scène environ 64 fois pour obtenir les meilleurs résultats. bien que je ne me sois pas testé, il y a des limites dans box2d qui vous empêchent d'utiliser des scènes plus grandes. par exemple, il existe une valeur définie dans le
b2Setting.h
fichier,#define b2_maxTranslation 2.0f
vous pouvez modifier les paramètres de box2d mais cela ne semble pas recommandé.la source
Avez-vous envisagé de ralentir la vitesse du mouvement de swing en fonction de la distance entre la corde et le fil à plomb (le centre)?
la source
Lorsque le joueur est plus loin que la longueur de la corde, le joueur sera immédiatement repoussé avec une force égale à la distance qu'il a franchie. Cela devrait fonctionner sans se sentir élastique et devrait être intuitif pour le joueur. Vous devrez peut-être modifier votre physique pour obtenir les meilleurs résultats pour votre jeu.
Lorsque la corde est attachée. Enregistrez une
maxLength
valeur.Chaque mise à jour, vérifiez
distance
entre leplayer
et leattachPoint
Si le
distance
est inférieur à lamaxLength
mise à jour normalement, aucun effet de corde.Si la distance est supérieure à la
maxLength
, trouvez lenormal
duattachPoint
au au joueur. Obtenez la différence entre ledistance
et lemaxLength
. Ajoutez àplayerVelocity
,normal
multiplié par la différence.Pseudo code:
la source
dx = player.x - attachpoint.x
etdy = player.y - attachpoint.y
.Si vous regardez http://www.cocos2d-iphone.org/archives/1112 il y a une implémentation d'une corde avec un corps rigide attaché à l'extrémité de la corde. Il utilise Box2D pour le moteur physique. Si vous regardez le code source, je suis sûr que vous pouvez l'implémenter dans n'importe quelle langue que vous aimez.
En outre, le lien ci-dessus vers la question de la corde est le mien et cette démo (lien fourni) ci-dessus a vraiment aidé.
la source