Mouvement RPG de haut en bas avec correction?


27

J'espère que nous avons tous joué Zelda: Un lien vers le passé, veuillez me corriger si je me trompe, mais je veux émuler ce type de mouvement de personnage 2D de haut en bas avec une touche de correction. Cela a été fait dans d'autres jeux, mais je pense que cette référence serait la plus facile à comprendre. Plus précisément, le type de mouvement et de correction dont je parle est:

  • Le mouvement flottant n'est pas limité aux mouvements basés sur des tuiles comme Pokemon et d'autres jeux où un tapotement du pavé de mouvement vous déplace d'un carré dans cette direction cardinale. Ce mouvement flottant devrait pouvoir réaliser un mouvement diagonal.
  • Si vous marchez vers l'ouest et que vous arrivez à un mur qui est diagonal de façon nord-est / sud-ouest, vous êtes corrigé dans un mouvement sud-ouest même si vous continuez à maintenir la gauche (ouest) sur le contrôleur. Cela devrait fonctionner pour les deux diagonales corrigeant dans les deux directions.
  • Si vous êtes à quelques pixels de marcher carrément dans une porte ou un couloir, vous êtes corrigé à marcher dans le couloir ou dans le couloir, c'est-à-dire que vous cogner dans le coin vous pousse à entrer dans le hall / la porte.

J'ai cherché des moyens efficaces d'y parvenir et je n'ai pas eu de chance. Pour être clair, je parle du mouvement du personnage humain, pas du mouvement d'un PNJ. Leurs ressources sont-elles disponibles sur ce type de mouvement? Des équations ou des algorithmes expliqués sur un wiki ou quelque chose?

J'utilise XNA Framework, y a-t-il quelque chose pour y aider?

Réponses:


23

Eh bien, le premier point est facile. Vous stockez et manipulez simplement la position du personnage en coordonnées universelles ou en pixels au lieu de coordonnées basées sur des mosaïques. Si vous rencontriez un problème avec cela, cela pourrait être dû à un choix confus de représentation pour votre monde et votre espace de tuiles, alors peut-être devriez-vous publier plus de détails à ce sujet / poser une question spécifique et distincte.

Pour le deuxième point, l'approche la plus directe serait de prendre le vecteur de mouvement (normalisé) du joueur et de l'ajouter au vecteur normal du mur, puis de le renormaliser. Le signe des composants du vecteur résultant indiquera comment le mur est lié au mouvement du joueur tandis que le vecteur lui-même indique dans quelle direction le joueur peut maintenant se déplacer.

Pour le troisième point, en supposant que vous ayez des rectangles de collision pour le mur et le joueur, vous devriez être en mesure de déterminer combien de rectangle de collision du joueur entre en contact avec le rectangle de collision du mur. Si, par exemple, le joueur se déplace vers la droite et frappe un mur vertical, vous comparez les étendues de l'axe Y des rectangles de collision - si si l'étendue du joueur dépasse l'étendue du mur d'un certain seuil, disons 75% de l'Y du joueur étendue de l'axe, alors vous "trichez" le joueur vers la porte.

J'ai fait un bon nombre d'hypothèses ici sur l'apparence de votre modèle d'objet dans votre code et les techniques que vous avez choisies - en grande partie en raison de la généralité de votre question. J'ai essayé de suggérer des approches simples (mais peut-être pas optimales) pour la même raison. Si vous pouvez fournir des informations plus spécifiques, dans cette question ou dans une nouvelle, je peux essayer de fournir plus de détails ou une meilleure idée.


Ouais, faire flotter le personnage n'était pas un problème. S'assurer simplement que les gens voient que c'était une exigence. Vous m'avez donné la réponse clé: des carreaux ayant des vecteurs! Je ne peux pas croire que je n'y ai pas pensé. Merci.
Corey Ogburn

Dans zelda , il n'y avait qu'un seul angle où ils pouvaient être, donc il n'y avait pas besoin de calculer des vecteurs normaux, c'était juste un cas spécial dans le code.
BlueRaja - Danny Pflughoeft

Je ne comprends pas comment vous donnez un vecteur à une tuile. À quoi cela ressemblerait-il?
testez

Une tuile contient probablement déjà des données comme son graphique, qu'elle soit passable, etc., c'est juste un autre champ. Par exemple: struct Tile {vector2 normal; ...} La valeur de la normale devrait venir avec les données qui définissent la tuile
Josh

@JoshPetrie Revisting this. Une tuile qui peut entrer en collision dans plusieurs directions n'aurait-elle pas besoin de plusieurs vecteurs? Je ne suis pas sûr de comprendre comment une tuile peut avoir un seul vecteur.
tester

4

Une réponse possible pour le deuxième point est de projeter le vecteur de mouvement du joueur le long du vecteur de mur en utilisant un produit scalaire (ab * normalisé (b)). Vous obtenez alors un vecteur qui vous indique jusqu'où déplacer le joueur dans la direction du mur, et si vous déplacez le joueur par ce vecteur, vous obtenez une «diapositive» le long du mur. A bien fonctionné pour moi dans un projet de jeu précédent.


3

Excellente réponse pour Josh, mais je vais ajouter quelques suggestions: - Pour plus d'informations sur le glissement contre les murs, consultez ma question - à partir de cette réponse, j'ai réussi à le faire fonctionner très bien. - Si je ne me trompe pas, lorsque vous montez sur l'écran, le lien facilitera l'alignement sur le carré de grille horizontal le plus proche. De cette façon, lorsque vous arrivez aux portes, vous êtes plus susceptible d'être correctement aligné (peut-être tort). - Pour faciliter le passage des portes, assurez-vous que la boîte de collision de votre personnage est bien plus petite que la largeur de la porte.


Ou peut-être que la boîte de collision est un cercle?
Oskar Duveborn

2

Pour corriger l'entrée des portes, vous pouvez rendre l'objet de collision de la porte légèrement plus grand que l'image de la porte. Il en résulterait le même effet proposé par Josh, mais sans avoir à calculer la proximité du rectangle de collision du mur.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.