Signaler

[SFML] gestion des collisions avec tilemap

Posez votre question Rune188 5Messages postés lundi 20 février 2017Date d'inscription 26 septembre 2017 Dernière intervention
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;
}


Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !