Организация кода для игры с использованием SDL
Я использую SDL уже несколько дней, и после нескольких уроков я решил начать разработку собственного клона Galaga. Однако у меня возникли трудности с поиском правильного макета для моего кода.
Например, у меня есть класс Spaceship, определенный следующим образом:
class Spaceship : public Sprite
{
public:
Spaceship(SDL_Surface *surface);
Spaceship(const char *filename);
void handleEvent(SDL_Event *event);
};
где Sprite - базовый класс, который удерживает позицию на экране и т. д. Мой конструктор будет что-то вроде:
Spaceship::Spaceship(SDL_Surface *surface) :
Sprite(surface)
{
m_y = Game::screenHeight() - m_surface->h; //positions the ship at the bottom
}
Из того, что я видел, невозможно использовать Game::screenWidth() [статический класс], потому что мне нужно было бы включить "game.h", который в основном является основным классом игры и включает в себя "Spacehip.h", создавая в основном бесконечный цикл (я пытался использовать #ifndef и т. д. безуспешно).
Итак, вот мои вопросы:
- Можно ли достичь такого результата?
- Если это не так, как мне организовать свой код, чтобы избежать подобных проблем? Должен ли я создать класс Screen, который я использую для хранения информации об экране и т. Д., И включить его как в game.h, так и в spacehip.h?
РЕДАКТИРОВАТЬ: я нашел способ преодолеть первую проблему (я просто добавил "game.h" включить в файл cpp, а не в файл заголовка). Тем не менее, я до сих пор задаюсь вопросом, что является лучшим выбором дизайна в этом случае
2 ответа
Если вы хотите хранить только указатели или ссылки на эти объекты, то вы можете объявить один или оба класса вперед с помощью class Game;
или же class Spaceship;
, Это также хорошо, если они принимают эти объекты в качестве параметров или возвращают их (за некоторыми исключениями, afaik).
Если вы действительно хотите, чтобы оба имели член другого, то это невозможно, так как каждый объект имел бы внутри себя свою копию.
Вам нужно разорвать цикл в вашем графике зависимостей.
Например, можно добавить поле в свой класс космического корабля, которое сохраняет высоту экрана.