1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    septembre 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : septembre 2017
    Messages : 3
    Points : 1
    Points
    1

    Par défaut gestion des collisions avec tilemap

    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:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    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:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int currentTileNbr(AnimatedSprite animatedSprite)
    {
        nbrCol = std::ceil((animatedSprite.getPosition().x) / 32);
        nbrRow = std::ceil((animatedSprite.getPosition().y) / 32);
        currentile = (((nbrRow) * 50) + (nbrCol));
        return currentile;
    }

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    mai 2008
    Messages
    22 338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : mai 2008
    Messages : 22 338
    Points : 153 128
    Points
    153 128
    Billets dans le blog
    8

    Par défaut

    Bonjour,

    Mon erreur vient elle de ma fonction pour calculer le tile sur lequel ce trouve mon perso ou d'ailleurs?
    Pour trouver réponse à cette question, vous devez simplifier au maximum le cas problématique (pour ne garder que l'élément joueur et la tuile et faire les tests librement), utiliser la sortie console ou un débogueur pour vérifier que tout correspond à votre vision.


    Pour la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int currentTileNbr(AnimatedSprite animatedSprite)
    {
        nbrCol = std::ceil((animatedSprite.getPosition().x) / 32);
        nbrRow = std::ceil((animatedSprite.getPosition().y) / 32);
        currentile = (((nbrRow) * 50) + (nbrCol));
        return currentile;
    }
    Je vous conseille de ne pas utiliser d'identifiant de tuile. Il sera plus simple de gérer une logique où les tuiles sont placées dans un tableau 2D et d'utiliser le numéro de colonne et le numéro de ligne pour accéder au tableau.
    Sinon, la fonction me semble juste. Simplement, les nombres magiques (ici, 32 et 50) peuvent être le mal .

    Dans la fonction de déplacement du joueur, pourquoi faites-vous toujours currentTile-1 ? (pour les quatre cas)
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    septembre 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : septembre 2017
    Messages : 3
    Points : 1
    Points
    1

    Par défaut

    Bonjour,
    d'abord merci pour votre aide
    ensuite:

    Citation Envoyé par LittleWhite Voir le message
    Je vous conseille de ne pas utiliser d'identifiant de tuile. Il sera plus simple de gérer une logique où les tuiles sont placées dans un tableau 2D et d'utiliser le numéro de colonne et le numéro de ligne pour accéder au tableau.
    Sinon, la fonction me semble juste. Simplement, les nombres magiques (ici, 32 et 50) peuvent être le mal .

    Dans la fonction de déplacement du joueur, pourquoi faites-vous toujours currentTile-1 ? (pour les quatre cas)
    J'utilise un vector de Tile (avec identifiant et un type ) car cela me permet d'utiliser la class Tilemap et son tableau de vertex (que j'ai repris de: https://www.sfml-dev.org/tutorials/2...x-array-fr.php et modifié afin quel utilise un vector de tile)
    Concernant le "currentTile-1" : je fais ainsi car il me semble que les vector (ici celui de Tile) comme les tableau commence à zero.

  4. #4
    Expert éminent sénior

    Profil pro
    Développeur informatique
    Inscrit en
    novembre 2006
    Messages
    6 309
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : novembre 2006
    Messages : 6 309
    Points : 12 359
    Points
    12 359

    Par défaut

    ehh il me semble que c'est l'inverse index=( y * nombre de colonne )+ colonne , à vérifier
    Donc au besoin modifier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    currentile = (((nbrRow) * 50) + (nbrCol));
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    currentile = (((nbrCol) * 50) + (nbrRow));
    * Descartes: "je pense donc je suis"
    * Bob l'éponge : "je pense donc j'essuie"
    * l'infirmière : "je panse donc je suis"

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    septembre 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : septembre 2017
    Messages : 3
    Points : 1
    Points
    1

    Par défaut

    Citation Envoyé par Mat.M Voir le message
    ehh il me semble que c'est l'inverse index=( y * nombre de colonne )+ colonne , à vérifier
    Donc au besoin modifier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    currentile = (((nbrRow) * 50) + (nbrCol));
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    currentile = (((nbrCol) * 50) + (nbrRow));
    Non sa n'a pas l'aire d'être ça
    Pour l'instant sa fonctionne quand je monte ou vais à droite mais si je fais cela ça ne fonctionne plus du tout

  6. #6
    Expert éminent sénior

    Profil pro
    Développeur informatique
    Inscrit en
    novembre 2006
    Messages
    6 309
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : novembre 2006
    Messages : 6 309
    Points : 12 359
    Points
    12 359

    Par défaut

    salut il faut déboguer pas-à-pas et mettre des points d'arrêts dans le code source pour examiner les variables et voir ce qui ne va pas
    * Descartes: "je pense donc je suis"
    * Bob l'éponge : "je pense donc j'essuie"
    * l'infirmière : "je panse donc je suis"

Discussions similaires

  1. Réponses: 3
    Dernier message: 06/01/2012, 15h26
  2. Gestion des collisions avec Allegro et une matrice
    Par yetimothee dans le forum Allegro
    Réponses: 4
    Dernier message: 22/06/2008, 18h38
  3. gestion des collisions avec sdl
    Par kirtap1969 dans le forum SDL
    Réponses: 3
    Dernier message: 18/10/2007, 21h16
  4. Importer avec Ogre / Gestion des collisions
    Par alex6891 dans le forum Ogre
    Réponses: 9
    Dernier message: 19/02/2006, 17h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo