Je veux avoir des pentes simples de 45 ° dans mon jeu de plateforme basé sur des tuiles, mais je ne peux tout simplement pas sembler descendre l'algorithme. Veuillez regarder le code et la vidéo, peut-être que je manque l'évidence?
//collisionRectangle is the collision rectangle of the player with
//origin at the top left and width and height
//wantedPosition is the new position the player will be set to.
//this is determined elsewhere by checking the bottom center point of the players rect
if(_leftSlope || _rightSlope)
{
//Test bottom center point
var calculationPoint = new Vector2(collisionRectangle.Center.X, collisionRectangle.Bottom);
//Get the collision rectangle of the tile, origin is top-left
Rectangle cellRect =
_tileMap.CellWorldRectangle(
_tileMap.GetCellByPixel(calculationPoint));
//Calculate the new Y coordinate depending on if its a left or right slope
//CellSize = 8
float newY = _leftSlope
? (calculationPoint.X % CellSize) + cellRect.Y
: (-1 * (calculationPoint.X % CellSize) - CellSize) + cellRect.Y;
//reset variables so we dont jump in here next frame
_leftSlope = false;
_rightSlope = false;
//now change the players Y according to the difference of our calculation
wantedPosition.Y += newY - calculationPoint.Y;
}
Vidéo de ce à quoi cela ressemble: http://youtu.be/EKOWgD2muoc
xna
c#
xna-4.0
platformer
xNidhogg
la source
la source
Réponses:
D'après ce que je comprends en lisant votre question, vous voulez calculer la
Y
position correcte , compte tenu de laX
position du joueur. C'est assez banal. Jetez un oeil à cette image:En supposant que votre tuile de pente est à une position donnée
x,y
(l'origine est en bas à gauche comme dans l'image). Vous avez la position du joueurx1
et la largeur et la hauteur de la tuile inclinée (u, v
).x, y
etx1
sont des coordonnées mondiales.Compte tenu de ces paramètres, la position Y de vos joueurs (
y1
) serait:Si vous ne traitez qu'avec des angles de 45 degrés, cela devient encore plus simple:
Si la pente est inversée, c'est:
la source
m
etb
dans votre calcul?Bien que cela soit déjà répondu, permettez-moi de proposer une autre équation:,
y = mx + b
où y est la coordonnée calculée, m est la pente (-1 pour descendre à 45 degrés, 1 pour monter à 45 degrés), et b est l'ordonnée à l'origine - - la coordonnée y où x = 0.Cela vous permet un peu plus de flexibilité; vous pouvez modifier m pour calculer une pente différente de 45 degrés. Par exemple, un m de pi / 3 vous donne une pente de 30 degrés.
la source
Vous pouvez trouver beaucoup de valeur sur ce site: http://info.sonicretro.org/Sonic_Physics_Guide
Spécifiquement pour ce que vous recherchez, consultez la section Solid Tiles: Slopes and Curves. Cela vous montre essentiellement comment on pense que cela a été accompli dans les premiers jeux Sonic.
la source
Vous voudrez peut-être vous pencher sur la Théorie de l'Axe Séparé, cela résoudra votre problème de pente, mais cela nécessite un peu de maths et la théorie elle-même prend un certain temps pour obtenir votre tête. Je vous ai lié à un tutoriel et à un livre qui l'expliquent mieux
metanetsoftware Tutorial
Détection de collision en temps réel
la source
Je pense que vous avez soit une erreur au cas par cas ailleurs, soit que vous ne définissez pas les indicateurs _leftSlope / _rightSlope au bon moment. Ce code ne touche pas du tout le mouvement X, mais cela semble être votre problème dans la vidéo.
Vous devez vérifier si ces indicateurs sont déclenchés. Vérifiez ensuite votre détection de collision horizontale: vous ne voulez pas qu'elle se déclenche sur une pente.
la source