2013-08-13 3 views
0

Я пытаюсь сделать так, чтобы мои враги в моей игре сортировались в векторе по порядку расстояния от игрока, и поэтому я использую функцию сортировки. Очевидно, мои враги - это объекты, поэтому основного предиката недостаточно, и я должен сделать свою собственную функцию, поэтому я и сделал.STL Сортировка статической функции

Однако эти функции должны быть статическими, и поэтому, как в этой функции я могу сравнить расстояние между противником и игроком?

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

(Также определено статическое содержимое в заголовке). Это используется для сортировки STL с помощью вектора.

Я пробовал поиск по всему миру, но perhps Я даже не признаю истинную проблему, поэтому любая помощь будет оценена, или альтернативный способ сделать это будет рассмотрен. Заранее спасибо :)

+0

Так что сделайте его классом-статическим членом fn? или еще лучше, класс-функтор, который, вероятно, будет встроен. Или, может быть, сделать World другом Enemy? (И эти необработанные указатели в этом векторе должны быть страшными). – WhozCraig

+0

Не могли бы вы объяснить немного более глубокое? :) Я вернусь завтра, (я слишком долго трачу на это), но я обязательно посмотрю на это :) –

ответ

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 лямбдах:

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

+1 один из многих способов сделать это. Ницца. – WhozCraig

+0

Будет ли это работать, даже если я буду внутри мирового класса? :) Это выглядит хорошо, и я буду пытаться это через некоторое время, но я просто хотел продолжить свое понимание и т. Д. :) –

+0

Извините, что снова ударил это, я пытаюсь назвать это из мирового класса, я пытаюсь несколько вещей но я не уверен, что происходит не так. Если толчок нажимается, я полагаю, я мог бы переместить весь материал сюда в класс, в котором есть объекты мира. Пожалуйста, порекомендуйте! –

0

Я исправил свою проблему. Вместо того, чтобы пытаться получить доступ к нестатической функции-члену внутри статической функции, я сделал дистанционную проверку игрока за пределами этого и присвоил результат сущностям/врагам. Таким образом, когда я называю sortXDistance, я только что сделал:

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

Спасибо за вашу помощь, я стараюсь ваши пути из, но продолжал получать ошибки я не понял :) Мой путь здесь, по крайней мере для справки если кто-нибудь когда-нибудь столкнется с этой проблемой и хочет моего ужасного пути, и я дам вам ответ на наиболее вероятный способ сделать это.

Смежные вопросы