Pentes à 45 ° dans un jeu de plateforme 2D basé sur des tuiles

12

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

xNidhogg
la source
1
Les vecteurs ne sont-ils pas géniaux? : D
Gustavo Maciel

Réponses:

10

D'après ce que je comprends en lisant votre question, vous voulez calculer la Yposition correcte , compte tenu de la Xposition du joueur. C'est assez banal. Jetez un oeil à cette image:

pente

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 joueur x1et la largeur et la hauteur de la tuile inclinée ( u, v). x, yet x1sont des coordonnées mondiales.

Compte tenu de ces paramètres, la position Y de vos joueurs ( y1) serait:

y1 = y + (x1 - x) * (v / u)

Si vous ne traitez qu'avec des angles de 45 degrés, cela devient encore plus simple:

y1 = y + (x1 - x)

Si la pente est inversée, c'est:

y1 = y + (v - (x1 - x))
bummzack
la source
après avoir appliqué le correctif @SkimFlux plus votre nouveau formulaire et certaines choses stupides, j'ai oublié que cela fonctionnait. Merci.
xNidhogg
Ne pourriez-vous pas utiliser y = mx + b pour un calcul plus simple?
ashes999
@ ashes999 Je ne pense pas que ce soit beaucoup plus simple que ce que j'ai écrit. Quels sont met bdans votre calcul?
bummzack
@bummzack m est votre pente (1 pour une pente de 45 degrés vers le bas, -1 pour vers le haut) et b serait l'ordonnée à l'origine sur l'axe des x. Algèbre de grade 9. Je dis juste.
ashes999
@ ashes999 Oui, cela fait longtemps. N'hésitez pas à poster cette équation comme réponse.
bummzack
8

Bien que cela soit déjà répondu, permettez-moi de proposer une autre équation:, y = mx + boù 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.

cendres999
la source
4

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.

SpartanDonut
la source
lecture intéressante, mais trop complexe. Ce type de pente est le seul que je souhaite, donc devrait simplifier la solution. Un système de carte / capteur / scanner de hauteur serait exagéré pour cela. Merci d'avoir trouvé le lien.
xNidhogg
2

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

dbomb101
la source
c'est trop, imo. Il s'agit d'un cas très simplifié et il n'y aurait pas besoin d'autres utilisations de SAT. Merci d'avoir pris le temps de remonter les liens.
xNidhogg
2

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.

SkimFlux
la source
oh mon dieu. En fait, je ne veux pas de détection de collision horizontale ou verticale lorsque cela se produit. J'ai totalement oublié de désactiver cela. Semble en quelque sorte mieux maintenant, mais pas encore fait. Merci.
xNidhogg