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/NbomPS:
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;
}
}