Я создаю собственную версию Atari Gravitar (https://my.ign.com/atari/gravitar) с библиотекой SFML для проекта университета, и у меня возникла ошибка сегментации (в режиме отладки она отображается как EXC_BAD_ACCESS), когда я вызываю obj->onBoundHit(bound)
, даже если непосредственно перед тем, как я успешно вызвал obj->getShape
. Что я здесь не так делаю? Как возможно, что указатель obj
действителен, но выдает ошибку сегментации, когда я обращаюсь к ней с вызовом функции onBoundHit(bound)
?
Я попытался вызвать другие (виртуальные и не виртуальные) функции для этого указателя obj
, и все они сделали то, что должны. Так что, похоже, проблема в onBoundsHit
функции.
enum Bound {
NO_BOUND,
TOP_BOUND,
LEFT_BOUND,
RIGHT_BOUND,
BOTTOM_BOUND
};
// Object.hpp
class Object {
protected:
// Attributes...
public:
// Some function signatures here...
virtual void onBoundHit(Bound);
// Other function signatures...
};
// Object.cpp
void Object::onBoundHit(Bound bound) { }
void Engine::checkBoundsHit(Object* obj) {
FloatRect boundsRect = obj->getShape()->getGlobalBounds();
Bound bound = NO_BOUND;
if (boundsRect.left <= 0)
bound = LEFT_BOUND;
else if (boundsRect.top <= 0)
bound = TOP_BOUND;
else if (boundsRect.left + boundsRect.width >= game->getViewWidth())
bound = RIGHT_BOUND;
else if (boundsRect.top + boundsRect.height >= game->getViewHeight())
bound = BOTTOM_BOUND;
if (bound != NO_BOUND)
obj->onBoundHit(bound);
}
Эта функция вызывается каждый кадр для каждого объекта в сцене, и ошибка возникает, когда я на большой планете и стреляю непрерывно (пробел, чтобы стрелять) к границе и вв то же время я ускоряюсь к этой границе с космическим кораблем. Если я отлаживаю, поврежденный объект выглядит как Bullet, который не перекрывает функцию onBoundHit
(как и другие виртуальные функции в суперклассе Object, которые не переопределены в Bullet, поэтому проблема не в виртуальных функциях вообще).У меня есть общедоступный репозиторий GitHub: https://github.com/lusvelt/non-gravitar. Я был бы очень рад, если бы кто-нибудь мог помочь мне с этой проблемой, даже объяснив мне, как возможно, что есть ошибка сегментации, даже когда указатель действителен.