0

我正在努力让我的游戏中的敌人按照与玩家的距离顺序排列在一个向量中,所以我使用了 sort 函数。显然,我的敌人是对象,所以基本谓词是不够的,我必须创建自己的函数,所以我做到了。

但是,这些函数必须是静态的,那么,如何在这个函数中比较敌人和玩家之间的距离呢?

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;
}

这是我正在尝试使用的代码,但由于它是一个静态函数(在标题中定义为静态),它无法访问成员变量,因此以下内容不起作用:

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

(也在标题中定义静态)这用于使用 Vector 进行 STL 排序。

我试过用谷歌搜索,但可能我什至没有认识到真正的问题,所以任何帮助都将不胜感激,或者会考虑另一种方法。先感谢您 :)

4

2 回答 2

4

使用具有对 World 对象的引用的仿函数作为成员,如下所示:

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));

或者,使用 C++11 lambda:

auto CloserToPlayer = [&](Entity const * lhs, Entity const * rhs) {
        return theWorld.getPlayerDistance(lhs) < theWorld.getPlayerDistance(rhs);
    };
std::sort(entities.begin(), entities.end(), CloserToPlayer);
于 2013-08-13T21:01:44.130 回答
0

我解决了我自己的问题。我没有尝试访问静态函数内的非静态成员函数,而是在此之外进行了玩家距离检查,并将结果分配给实体/敌人。这样,当我调用 sortXDistance 时,我只是做了:

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

感谢您的帮助,我确实尝试了您的方法,但只是不断出现我不明白的错误:) 如果有人遇到此问题并想要我的糟糕方法,我的方法至少可供参考,我会给你回答最有可能更好的方法。

于 2013-08-14T11:26:50.503 回答