2012-01-13 2 views
3

Я использую 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, а не в заголовочном файле). Тем не менее, я все еще задаюсь вопросом, какой лучший выбор дизайна в этом случае.

+0

Я вообще решаю проблему «основного игрового класса», избегая «основного игрового класса». Один из способов решения этой проблемы - позволить вашей * основной функции * создавать экземпляры всех необходимых вам элементов, а затем использовать Injection Dependency для передачи только бит каждого класса в каждом классе, а не полагаться на статическое состояние (эффективно глобальные переменные). –

+0

«Как мне проектировать проект» - довольно широкий вопрос, но вы в основном делаете все правильно (на самом деле нет правильного/неправильного способа разработки кода при выполнении учебного проекта) – thedaian

+0

@ MerlynMorgan-Graham Спасибо, я буду оценивать этот подход тоже –

ответ

0

Вам необходимо разбить цикл в графе зависимостей.

Например, вы можете добавить поле в свой класс Spaceship, который сохраняет высоту экрана.

+0

Я уже думал об этом, но это было бы проблемой, если бы я хотел изменить разрешение экрана во время игры. –

+0

@Narrakan. Мой собственный склон, если бы я был в вашей ситуации, заключался бы в том, чтобы разместить в классах Spaceship ссылку (ссылку) на какой-то экземпляр класса настроек. –

1

Если вы хотите хранить указатели или ссылки на эти объекты, вы можете переадресовать один или оба класса с помощью class Game; или class Spaceship;. Это также прекрасно, если они берут эти объекты в качестве параметров или возвращают их (за некоторыми исключениями, afaik).

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

+1

@AnonymousDownvoter: комментарий будет оценен. –

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