Я использую SDL в течение нескольких дней, и я решил после нескольких учебных уроков начать разработку своего собственного клона Galaga. Тем не менее, я с трудом пытался найти правильный макет для моего кода.Организация кода для игры с использованием SDL
Например, у меня есть класс Космического корабля определяется следующим образом:
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
}
Из того, что я видел, что это не представляется возможным использовать игру :: screenWidth() [статический класс], потому что я должен был бы включать «game.h», который в основном основной класс игры и включает в себя «spacehip.h», создавая в основном бесконечный цикл (я пробовал использовать #ifndef и т. д. без успеха).
Итак, вот мои вопросы:
- Можно ли добиться подобного результата?
- Если это не так, как мне организовать мой код, чтобы избежать подобных проблем? Должен ли я создать класс Screen, который я использую для хранения информации о экране и т. Д., И включить его как в game.h, так и в spacehip.h?
EDIT: Я нашел способ преодолеть первую проблему (я просто добавил «game.h» включить в файл CPP, а не в заголовочном файле). Тем не менее, я все еще задаюсь вопросом, какой лучший выбор дизайна в этом случае.
Я вообще решаю проблему «основного игрового класса», избегая «основного игрового класса». Один из способов решения этой проблемы - позволить вашей * основной функции * создавать экземпляры всех необходимых вам элементов, а затем использовать Injection Dependency для передачи только бит каждого класса в каждом классе, а не полагаться на статическое состояние (эффективно глобальные переменные). –
«Как мне проектировать проект» - довольно широкий вопрос, но вы в основном делаете все правильно (на самом деле нет правильного/неправильного способа разработки кода при выполнении учебного проекта) – thedaian
@ MerlynMorgan-Graham Спасибо, я буду оценивать этот подход тоже –