1
Général / Re : Pathfinding Problem
« le: Octobre 20, 2016, 01:54:38 am »
Je pense que je m'approche de la solution, ça ne marche toujours pas, mais en venant vous dire où j'en suit peut être que quelqu'un sauras m'aider...
Pour commencer, ma fonction getSpeed() sur un player, j'aimerais que ça correspond à la vitesse ou le joueur ira du centre d'une tile au centre de la prochaine, seulement, c'est en isométrique, et les centres des tiles voisines ne sont pas à la même distance, mais c'est pas le plus gros problème.
Ensuite, j'envois donc à la fonction update de mon player, le clock.restart().asSeconds() ...
Voici ma fonction update pour l'instant....
Seulement mon personnage fait du surplace, en ayant quand même les animations de deplacements (bras et jambes qui se mettent en route), et j'obtient ceci dans mon terminal avec le std::cout de la fonction (ça tourne en rond quoi...) :
Merci beaucoup..
Pour commencer, ma fonction getSpeed() sur un player, j'aimerais que ça correspond à la vitesse ou le joueur ira du centre d'une tile au centre de la prochaine, seulement, c'est en isométrique, et les centres des tiles voisines ne sont pas à la même distance, mais c'est pas le plus gros problème.
Ensuite, j'envois donc à la fonction update de mon player, le clock.restart().asSeconds() ...
Voici ma fonction update pour l'instant....
void Player::update(float dt, std::list<MapTile*> *path)
{
// for (auto& tile: *path)
// {
// std::cout << tile->getId() << " -> ";
// path->pop_front();
// }
if (!path->empty())
{
const float unitsPerTick = this->getSpeed() * dt; // Speed in Units per tick
std::cout << unitsPerTick << std::endl;
auto waypoint = path->front();
sf::Vector2i movementVector = sf::Vector2i(waypoint->getPositionCenter().x - this->getPositionCenter().x,
waypoint->getPositionCenter().y - this->getPositionCenter().y);
std::cout << movementVector.x << "," << movementVector.y << std::endl;
float moveVecLength = sqrt((movementVector.x * movementVector.x) + (movementVector.y * movementVector.y));
std::cout << "moveVecLength: " << moveVecLength << std::endl;
if (moveVecLength < unitsPerTick)
{
this->move(movementVector.x, movementVector.y);
this->setCurrentTile(waypoint);
std::cout << waypoint->getId() << " -> " << std::endl;
path->pop_front();
}
else {
movementVector.x = movementVector.x / moveVecLength;
movementVector.y = movementVector.y / moveVecLength;
movementVector = sf::Vector2i(movementVector.x * unitsPerTick, movementVector.y * unitsPerTick);
this->move(movementVector.x, movementVector.y);
}
} else {
counterAnimation = 0;
}
switch (mDirection) {
case Up: setRect(0); break;
case Down: setRect(0); break;
case Left: setRect(0); break;
case Right: setRect(0); break;
case DownLeft: setRect(0); break;
case UpLeft: setRect(0); break;
case UpRight: setRect(0); break;
case DownRight: setRect(0); break;
default: break;
}
if (rand() % 4 == 1)
this->counterAnimation++;
if (this->counterAnimation >= (this->nbAnimation - 1))
this->counterAnimation = 0;
}
{
// for (auto& tile: *path)
// {
// std::cout << tile->getId() << " -> ";
// path->pop_front();
// }
if (!path->empty())
{
const float unitsPerTick = this->getSpeed() * dt; // Speed in Units per tick
std::cout << unitsPerTick << std::endl;
auto waypoint = path->front();
sf::Vector2i movementVector = sf::Vector2i(waypoint->getPositionCenter().x - this->getPositionCenter().x,
waypoint->getPositionCenter().y - this->getPositionCenter().y);
std::cout << movementVector.x << "," << movementVector.y << std::endl;
float moveVecLength = sqrt((movementVector.x * movementVector.x) + (movementVector.y * movementVector.y));
std::cout << "moveVecLength: " << moveVecLength << std::endl;
if (moveVecLength < unitsPerTick)
{
this->move(movementVector.x, movementVector.y);
this->setCurrentTile(waypoint);
std::cout << waypoint->getId() << " -> " << std::endl;
path->pop_front();
}
else {
movementVector.x = movementVector.x / moveVecLength;
movementVector.y = movementVector.y / moveVecLength;
movementVector = sf::Vector2i(movementVector.x * unitsPerTick, movementVector.y * unitsPerTick);
this->move(movementVector.x, movementVector.y);
}
} else {
counterAnimation = 0;
}
switch (mDirection) {
case Up: setRect(0); break;
case Down: setRect(0); break;
case Left: setRect(0); break;
case Right: setRect(0); break;
case DownLeft: setRect(0); break;
case UpLeft: setRect(0); break;
case UpRight: setRect(0); break;
case DownRight: setRect(0); break;
default: break;
}
if (rand() % 4 == 1)
this->counterAnimation++;
if (this->counterAnimation >= (this->nbAnimation - 1))
this->counterAnimation = 0;
}
Seulement mon personnage fait du surplace, en ayant quand même les animations de deplacements (bras et jambes qui se mettent en route), et j'obtient ceci dans mon terminal avec le std::cout de la fonction (ça tourne en rond quoi...) :
moveVecLength: 31
0.033684
0,31
moveVecLength: 31
0.035512
0,31
moveVecLength: 31
0.033396
0,31
moveVecLength: 31
0.034238
0,31
moveVecLength: 31
0.033816
0,31
moveVecLength: 31
0.03396
0,31
moveVecLength: 31
0.033524
0,31
moveVecLength: 31
0.035762
0,31
moveVecLength: 31
0.03571
0,31
moveVecLength: 31
0.30348
0,31
moveVecLength: 31
0.033684
0,31
moveVecLength: 31
0.035512
0,31
moveVecLength: 31
0.033396
0,31
moveVecLength: 31
0.034238
0,31
moveVecLength: 31
0.033816
0,31
moveVecLength: 31
0.03396
0,31
moveVecLength: 31
0.033524
0,31
moveVecLength: 31
0.035762
0,31
moveVecLength: 31
0.03571
0,31
moveVecLength: 31
0.30348
0,31
moveVecLength: 31
Merci beaucoup..