Il y a une douzaine de façons de formuler cette question, mais pour garder ma pensée en ligne, je la formule en fonction de mon problème.
Je crée donc une plate-forme flottante que j'aimerais pouvoir simplement parcourir d'un point désigné à un autre, puis revenir au premier et passer entre les deux en ligne droite. Cependant, juste pour le rendre un peu plus intéressant, je veux ajouter quelques règles à la plateforme.
- Je le code pour parcourir des multiples de valeurs de tuiles entières de données mondiales. Donc, si la plate-forme n'est pas stationnaire, elle parcourra au moins une largeur ou une hauteur de tuile entière.
- Dans une longueur de tuile, je voudrais qu'il accélère d'un arrêt à une vitesse maximale donnée.
- En atteignant la distance d'une longueur de tuile, je voudrais qu'elle ralentisse jusqu'à un arrêt à une coordonnée de tuile donnée, puis répète le processus en sens inverse.
Les deux premières parties ne sont pas trop difficiles, essentiellement j'ai des problèmes avec la troisième partie. J'aimerais que la plate-forme s'arrête exactement à une coordonnée de tuile, mais étant donné que je travaille avec l'accélération, il semblerait facile de commencer simplement à appliquer l'accélération dans la direction opposée à une valeur stockant la vitesse actuelle de la plate-forme une fois qu'elle atteint la longueur d'une tuile de distance (en supposant que la tuile parcourt plus d'une longueur de tuile, mais pour garder les choses simples, supposons simplement que c'est le cas) - mais alors la question est quelle serait la valeur correcte pour que l'accélération augmente pour produire cet effet? Comment pourrais-je trouver cette valeur?
acceleration = desired_velocity - currentVelocity
Appliquez ensuite cette accélération comme vous le feriez normalement. Je vais créer une réponse un peu plus loin en montrant ce que je fais.Réponses:
Utiliser ces comportements de pilotage comme guide. En regardant le comportement d'arrivée:
Nous pouvons créer une fonction "arriver à" comme quelque chose de similaire à ceci:
Cela mettra à jour l'accélération que nous devons utiliser pour appliquer à l'objet en mouvement.
la source
Jetez un œil à cette page: http://sol.gfxile.net/interpolation/index.html
Il semble que vous souhaitiez un effet similaire au smoothstep:
Si vous avez le point le plus à gauche, le point le plus à droite que la plate-forme devrait atteindre et le temps qu'elle devrait utiliser pour faire une séquence complète, quelque chose comme ceci peut être correct:
cadre avant:
si vous utilisez un moteur physique, vous pouvez le faire avec des impulsions, cela ne devrait pas être si difficile à traduire. Si vous souhaitez un processus encore plus fluide, vous pouvez augmenter le niveau de douceur.
la source
Vous pouvez utiliser XnaTweener qui fournit des fonctions d' accélération qui interpolent les valeurs d'un point à un autre de manière simple ...
Voici une réponse avec du code basé sur le projet Xna Tweener et une vidéo montrant comment il fonctionne ...
https://gamedev.stackexchange.com/a/26872/8390
[ÉDITER]
Vous devez avoir une séquence de touches qui définit le mouvement de la plate-forme, comme ceci:
Et puis vous pouvez gérer le mouvement de cette façon:
"DefaultPosition" est la position de départ, "Traslation" accumule le mouvement de plusieurs clés, et chaque traduction de clé est relative à la clé précédente, donc lorsque vous la multipliez par un facteur de rapport [0..1], elle renvoie la traduction relative interpolée parcourue pour atteindre cette clé à partir de la clé précédente ...
Voici une autre vidéo qui montre un mouvement de plateforme défini comme décrit ici ...
http://www.youtube.com/watch?v=ZPHjpB-ErnM&feature=player_detailpage#t=104s
J'ai refait ce code en essayant de le rendre facile à comprendre ... peut-être qu'il a un bug ... le code d'origine gère plusieurs instances du même mouvement mais avec quelques retards entre chaque instance ... Je suis sûr que ce code peut être repensé pour être plus facile ...
la source