2013-08-13 4 views
0

J'essaie de faire en sorte que mes ennemis dans mon jeu soient triés dans un vecteur dans l'ordre de la distance du joueur et donc j'utilise la fonction de tri. Évidemment, mes ennemis sont des objets, donc le prédicat de base ne suffit pas et je dois faire ma propre fonction, alors je l'ai fait.STL Trier l'utilisation de la fonction statique

Cependant, ces fonctions doivent être statiques, et ainsi, comment, dans cette fonction, puis-je comparer la distance entre l'ennemi et le joueur?

double World::getPlayerDistance(Entity* enemy){ 

int xDistance = enemy->m_xValue - m_pPlayer->m_xValue; 
int yDistance = enemy->m_yValue - m_pPlayer->m_yValue; 

double dist = sqrt(pow((double)xDistance, 2) + pow((double)yDistance, 2)); 

return dist; 
} 

Ceci est le code que je suis en train d'utiliser, mais comme il est une fonction statique (définie statique dans l'en-tête), il n'a pas accès aux variables membres et les indications suivantes ne fonctionne pas:

bool World::sortXDistance(Entity *i, Entity *j) { 
return (getPlayerDistance(i) < getPlayerDistance(j)); 
} 

(également défini statique en-tête) Ceci est destiné à être utilisé avec la STL de tri avec un vecteur.

J'ai essayé de googler, mais perhps je ne reconnais même pas le vrai problème, donc toute aide serait appréciée, ou une autre façon de le faire serait considérée. Merci d'avance :)

+0

Donc en faire un membre statique de classe fn? ou mieux encore, un foncteur de niveau classe qui sera probablement intégré. Ou peut-être faire du monde un ami de l'ennemi? (Et ces pointeurs bruts dans ce vecteur devraient faire peur). – WhozCraig

+0

Pourriez-vous expliquer un peu plus en profondeur? :) Je serai de retour demain, (j'ai déjà passé trop de temps sur ça) mais je vais certainement y jeter un coup d'oeil :) –

Répondre

4

Utilisez un foncteur avec une référence à un objet du monde en tant que membre, comme celui-ci:

struct CloserToPlayer 
{ 
    World const & world_; 
    CloserToPlayer(World const & world) :world_(world) {} 

    bool operator()(Entity const * lhs, Entity const * rhs) const 
    { 
     return world_.getPlayerDistance(lhs) < world_.getPlayerDistance(rhs); 
    } 
}; 

... 
World theWorld; 
std::vector<Entity*> entities; 
... 
std::sort(entities.begin(), entities.end(), CloserToPlayer(theWorld)); 

Ou, avec 11 C++ lambdas:

auto CloserToPlayer = [&](Entity const * lhs, Entity const * rhs) { 
     return theWorld.getPlayerDistance(lhs) < theWorld.getPlayerDistance(rhs); 
    }; 
std::sort(entities.begin(), entities.end(), CloserToPlayer); 
+0

+1 l'une des nombreuses façons de le faire. Agréable. – WhozCraig

+0

Est-ce que cela fonctionnera même si je suis dans la classe mondiale? :) Cela semble bon et je vais essayer cela dans un moment, mais je voulais juste approfondir ma compréhension, etc :) –

+0

Désolé de cogner à nouveau, je suis en train d'appeler cela de la classe mondiale, j'essaie plusieurs choses mais je ne suis pas sûr de ce qui ne va pas, exactement. Si pousser les coeurs à pousser, je suppose que je pourrais déplacer tous les trucs ici à la classe qui a des objets du monde à l'intérieur. S'il vous plaît donnez votre avis! –

0

J'ai corrigé mon propre problème. Au lieu d'essayer d'accéder à une fonction de membre non statique à l'intérieur d'une fonction statique, j'ai fait la vérification de distance du joueur en dehors de cela, et assigné le résultat aux entités/ennemis. De cette façon, quand je l'appelle sortXDistance, je viens de le faire:

bool World::sortXDistance(Entity *i, Entity *j){ 
    return (i->m_playerDistance < j->m_playerDistance); 
} 

Merci pour votre aide, je l'ai fait essayer vos moyens de sortir mais juste continué à obtenir des erreurs que je ne comprenais pas :) Mon chemin est ici au moins pour référence Si quelqu'un a déjà ce problème et veut ma façon terrible, et je vais vous donner la réponse pour le meilleur moyen de le faire.

Questions connexes