Comment gérer les plateformes mobiles dans un jeu de plateforme?

15

Je ne veux pas utiliser box2d ou quoi que ce soit, je veux juste des plates-formes mobiles simples (haut-bas, gauche-droite, diagonales et circulaires). Ma question est de gérer l'ordre de mise à jour / la hiérarchie de contrôle afin que le joueur reste solidement fixé à la plate-forme, sans rebondir ni vaciller?

Iain
la source

Réponses:

16

Ma solution serait de traiter chaque entité physique dans la carte de jeu comme un nœud d'arbre et la carte elle-même comme nœud racine . Les nœuds peuvent contenir d'autres nœuds. Chaque nœud est contenu (directement ou indirectement) à l'intérieur du nœud de carte.

Par exemple, supposons que votre personnage se trouve sur une plate-forme. Le nœud de la plateforme contient le nœud du personnage. Ainsi, chaque fois que la plate-forme se déplace, les nœuds qu'elle contient (dans ce cas, le personnage) se déplacent également.

Pour cela, chaque nœud doit avoir une position (x, y) par rapport au nœud parent . Par exemple, votre personnage pourrait être situé à (1,0) par rapport à la plate-forme, qui lui-même pourrait être situé à (10,10) par rapport à la carte du jeu. De cette façon, si la plate-forme se déplace, votre personnage avancera implicitement.

Dans cet arbre hiérarchique, la position de chaque nœud est égale à la somme de sa position plus chacune des positions de ses nœuds parents. Disons que nous voulons obtenir la position du personnage sur la carte. Nous calculons:

(position du caractère) + (position du nœud parent) + (position du nœud racine) = (1,0) + (10,10) + (0,0) = (11,0)

OK, donc pendant tout ce temps, votre personnage s'est tenu sur la plate-forme. Et le saut? Eh bien, au moment où il saute, vous le détachez de la plate-forme et l' attachez au nœud contenant la plate-forme ; dans ce cas, la carte (nœud racine).

Lorsqu'il atterrit à nouveau, attachez-le au nœud sur lequel il a atterri.

jSepia
la source
1
J'utiliserais également la vitesse x et y du nœud pour affecter le joueur. Exemple 1: la plateforme se déplace très rapidement et s'arrête, le joueur a une dynamique ascendante et est lancé. Exemple 2: la plateforme descend légèrement plus lentement que le joueur tombant à une vitesse mortelle. La plate-forme devrait pouvoir atterrir en toute sécurité au lieu de SPLUT
AttackingHobo
c'est une approche intéressante mais semble un changement assez complet sur mon moteur juste pour permettre les plateaux mobiles. Peut-être que si je crée objectOnPlatform en tant que composant que je peux à n'importe quel objet qui donne juste temporairement cet effet?
Iain
10

Je suggérerais de traiter cela comme un problème pseudo-physique et de le résoudre en utilisant le frottement au sol.

Vous utilisez déjà la gravité pour maintenir le personnage au sol, cela gère les situations où les plates-formes montent et descendent. Pour gérer les mouvements gauche et droit, le sol doit exercer une grande friction sur le personnage. En règle générale, ce niveau de friction serait de 1,0 ou 100%.

Si le personnage est immobile, alors sa vitesse est 0, et il hérite à la place de 100% de la vitesse de la plate-forme à cause du frottement. Quelque chose comme ceci:

character_velocity = friction * platform_velocity

L'avantage de cette approche est qu'elle se prête facilement à des mécanismes de plate-forme supplémentaires, comme être capable de surmonter les frottements sur les pentes raides, permettant à votre personnage de glisser. Il vous permet également de réduire facilement la friction pour créer de la glace sur laquelle le personnage glissera.

Il est également plus facile de faire face à des problèmes tels que les murs bas qui peuvent faire tomber votre joueur d'une plate-forme mobile. Si vous traitez simplement le personnage comme un enfant d'une plate-forme parent, il y a de fortes chances qu'il n'interagisse pas très facilement avec le reste de votre détection de collision sans beaucoup de travail.

Soviut
la source
0

Vous pouvez fixer la position du joueur non pas "absolu dans le niveau" mais "par rapport à la plate-forme", puis avoir une fonction qui donne sa position réelle. Je n'aime pas ça cependant.

Il serait probablement préférable (et plus simple) de lier le joueur à la plate-forme de sorte que lorsque la plate-forme bouge + x / + y, le joueur bouge autant.

o0 '.
la source