Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: Maps Isométriques Pathfinding  (Lu 1871 fois)

0 Membres et 1 Invité sur ce sujet

yovano_c

  • Newbie
  • *
  • Messages: 40
    • Voir le profil
    • E-mail
Maps Isométriques Pathfinding
« le: Septembre 04, 2016, 03:15:28 pm »
Bonjour.

Dans ma gestion d'évènements, au clique gauche de la souris je fais :

sf::Vector2i localPosition = sf::Mouse::getPosition(window);
sf::Vector2f worldPos = window.mapPixelToCoords(localPosition);
                           
tileClicked = map.getTileWithClick(worldPos);
if (tileClicked != nullptr)
{
     std::cout << "ID: " << tileClicked->getId() << " - isWalkable = " << tileClicked->isWalkable;
     std::cout << " - Position: (" << tileClicked->getPositionOnMap().x << "," << tileClicked->getPositionOnMap().y << ")" << std::endl;
                               
     if (tileClicked->isWalkable && tileClicked != p.getMapTile() && tileClicked != p.dstTile)
     {
          p.dstTile = tileClicked;
          pf.findPath(p.getMapTile(), tileClicked);
     }
}
 

Dans ma boucle principale je veut faire en sorte que le joueur suive ce chemin calculé par le système de pathfinding. je fais donc :

 p.followPath(pf.path);

mais il n'avance que d'une seule case je ne sais pas pourquoi....
et dans la console la ligne
std::cout << mapTile->getId() << " -> ";
affiche l'id de la map suivante a parcourir mais ça tourne en boucle.. je suppose que c'est le pop_front ou quelque chose du genre qui ne supprime pas ou merci de m'aider :/
Je vous met une vidéo pour que vous compreniez. Merci -> https://vid.me/Nbom

PS:
void Player::followPath(std::list<MapTile*> path)
{
    //std::cout << mapTile->getId() << std::endl;
   
    if (!path.empty())
    {
        mapTile = path.front();
       
        //std::cout << path.front()->getId() << " -> ";
        float px = mapTile->mConvex.getPosition().x;
        float py = mapTile->mConvex.getPosition().y;
        float ex = mTile.mConvex.getPosition().x;
        float ey = mTile.mConvex.getPosition().y;
        float x = (ex - px);
        float y = (ey - py);
        float v = sqrtf((x * x) + (y * y));
        float unitx = (x / v);
        float unity = (y / v);
        float movex = -mMovementSpeed * unitx;
        float movey = -mMovementSpeed / 2 * unity;
       
        if (mTile.getPositionInWindow() != mapTile->getPositionInWindow())
        {
            if (movex < 0)
            {
                if (movey < 0)
                    move(UpLeft);
                else if (movey > 0)
                    move(DownLeft);
                else if (movey == 0)
                    move(Left);
            }
            else if (movex > 0)
            {
                if (movey < 0)
                    move(UpRight);
                else if (movey > 0)
                    move(DownRight);
                else if (movey == 0)
                    move(Right);
            }
            else if (movex == 0)
            {
                if (movey < 0)
                    move(Up);
                else if (movey > 0)
                    move(Down);
            }
        }
        else
        {
            std::cout << mapTile->getId() << " -> ";
            path.pop_front();
        }
    }
    else
    {
        counterAnimation = 0;
    }
}
 
« Modifié: Septembre 04, 2016, 03:18:10 pm par yovano_c »

brunnerant

  • Newbie
  • *
  • Messages: 18
    • Voir le profil
    • E-mail
Re : Maps Isométriques Pathfinding
« Réponse #1 le: Novembre 09, 2016, 09:47:34 pm »
En fait, il faut simplement utiliser une boucle while, parce que dans l'état actuel, ta fonction followPath ne s'exécute que pour la première case de ton chemin  ;D