[SFML] gestion des collisions avec tilemap

Rune188 5 Messages postés lundi 20 février 2017Date d'inscription 26 septembre 2017 Dernière intervention - 26 sept. 2017 à 22:07
Bonjour,
je réalise un projet de jeu avec sfml et j'essaye de gérer les collisions sur ma map.

Pour cela j'utilise un vector qui contient des objets tile qui dispose chacun d'une énumération qui indique si le personnage peu marcher dessus, en dessous où pas du tous.

Je vérifie (avant chaque mouvement) que la direction vers laquelle le perso se dirige correspond a un tile dont le type (énumération) indique que le perso peu marché dessus.

la map est composé de 50x50 tiles de 32px.

Cependant cela ne semble pas fonctionner :(

Mon erreur vient elle de ma fonction pour calculer le tile sur lequel ce trouve mon perso ou d'ailleurs?

Il y t il une meilleur solution pour gérer mes collisions ?

Main.cpp:

sf::Vector2f movement(0.f, 0.f);
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up))
        {
            currentile = currentTileNbr(animatedSprite)-50;
            if (tabTile[currentile-1].getType() != type::off)
            {
                currentAnimation = &walkingAnimationUp;
                movement.y -= speed;
                noKeyWasPressed = false;
            }
             
        }
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down))
        {
            currentile = currentTileNbr(animatedSprite) + 50;
            if (tabTile[currentile - 1].getType() != type::off)
            {
                currentAnimation = &walkingAnimationDown;
                movement.y += speed;
                noKeyWasPressed = false;
            }
             
        }
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
        {
            currentile = currentTileNbr(animatedSprite) -1;
            if (tabTile[currentile - 1].getType() != type::off)
            {
                currentAnimation = &walkingAnimationLeft;
                movement.x -= speed;
                noKeyWasPressed = false;
            }
        }
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
        {
            currentile = currentTileNbr(animatedSprite) + 1;
            if (tabTile[currentile - 1].getType() != type::off)
            {
                currentAnimation = &walkingAnimationRight;
                movement.x += speed;
                noKeyWasPressed = false;
            }
        }
        animatedSprite.play(*currentAnimation);
        animatedSprite.move(movement * frameTime.asSeconds());


fonction pour connaitre le tile ou se trouve le perso:

int currentTileNbr(AnimatedSprite animatedSprite)
{
    nbrCol = std::ceil((animatedSprite.getPosition().x) / 32);
    nbrRow = std::ceil((animatedSprite.getPosition().y) / 32);
    currentile = (((nbrRow) * 50) + (nbrCol));
    return currentile;
}


Afficher la suite