Организация кода для игры с использованием SDL - PullRequest
2 голосов
/ 14 января 2012

Я использую SDL уже несколько дней, и после нескольких уроков я решил начать разработку собственного клона Galaga. Однако у меня возникли трудности с поиском правильного макета для моего кода.

Например, у меня есть класс Космического корабля, определенный следующим образом:

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 ]

2 голосов
/ 14 января 2012

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

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

0 голосов
/ 14 января 2012

Вам нужно разорвать цикл в вашем графике зависимостей.

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

...