Bonjour à tous,
J'ai beau réfléchir depuis maintenant plusieurs jours mais je viens vous demander de l'aide car là je ne sais même pas comment 'bien' implémenter ce que je voudrais faire. Je m'explique:
Je veux juste que mon personnage suive le chemin trouvé par mon système de pathfinding, en utilisant plusieurs choses, j'ai un attribut Speed qui es propre à chaque personnage, et j'ai donc une fonction pour récupéré les coordonnées du milieu de la Tile ( sf::Vector2f getPositionCenter(); ).
Cependant, je ne sais pas vraiment ou me placer dans mon code, ni comment réellement faire ça..
Voilà où j'en suit:
Dans ma gestion d'évènements:
sf::Vector2i localPosition = sf::Mouse::getPosition(mWindow);
sf::Vector2f worldPos = mWindow.mapPixelToCoords(localPosition);
mTileClicked = mMap.getTileWithClick(worldPos);
if (mTileClicked != nullptr)
{
std::cout << "ID: " << mTileClicked->getId() << " - isWalkable = " << mTileClicked->isWalkable;
std::cout << " - Position: (" << mTileClicked->getPositionOnMap().x << "," << mTileClicked->getPositionOnMap().y << ")" << std::endl;
if (mTileClicked->isWalkable && mTileClicked != mPlayer.getCurrentTile() && mTileClicked != mPlayer.getDestinationTile())
{
//mPlayer.setTile(mTileClicked);
//mPlayer.setDestinationTile(mTileClicked);
mPath = mPathfinder.findPath(mPlayer.getCurrentTile(), mTileClicked);
}
}
J'avais ensuite penser à implémenter ça dans ma fonction update du player que j'actualise avant chaque affichage que j'appelle du coup de la sorte
mPlayer.update(mElapsed, mPath);
et voilà ma fonction update :
void Player::update(float dt, std::list<MapTile*> path)
{
if (!path.empty())
{
std::cout << path.front()->getId() << std::endl;
}
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;
}
}
Simplement là je segfault en appelant l'update dans la boucle.... je recupere même pas l'id dans la fonction.. c'est vraiment le mPath qui pose problème... déja voici mon premier problème, c'est où me placer dans mon code pour faire bouger mon personnage.... et ensuite j'ai rechercher mais je n'ai que du pseudocode trouver sur internet pour bouger mon personnage mais je ne le comprend pas parfaitement:
if (pathFound)
{
// A path has been found
const float unitsPerTick = 8; // Speed in Units per tick
auto waypoint = waypoint_queue.front(); // The waypoint in use
Vector2i movementVector = Vector2i(waypoint.x - this->character.getPosition().x,
waypoint.y - this->character.getPosition().y);
float moveVecLength = sqrt((movementVector.x * movementVector.x) + (movementVector.y * movementVector.y));
if (moveVecLength < 0.2)
{
/// Move the player by the movement vector
this->character.setPosition(this->character.getPosition().x + movementVector.x, this->character.getPosition().y + movementVector.y);
waypoint_queue.pop_front();
}
else {
/// Normalize the movement vector
movementVector.x = movementVector.x / moveVecLength;
movementVector.y = movementVector.y / moveVecLength;
/// Scale the movement vector by the units per tick
movementVector = Vector2i(movementVector.x * unitsPerTick, movementVector.y * unitsPerTick);
/// Move the character by the new movement vector
this->character.setPosition(this->character.getPosition().x + movementVector.x, this->character.getPosition().y + movementVector.y);
}
if (waypoint_queue.empty())
pathFound = false;
}
PS: Comme vous pouvez le voir j'ai déjà aussi garder 2 petites variables pour garder l'avancer sur les tiles si ça peut aider, getCurrentTile() et getDestinationTile() avec les setters aussi.. j'ai pour le personnage getSpeed(), et du coup pour chaque tile getPositionCenter() mais je ne sais pas implémenter ça correctement, merci de m'aider :/