使用SDL组织游戏代码

时间:2012-01-13 21:19:30

标签: c++ sdl code-layout

我已经使用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”,它基本上是主要的游戏类,包括“spaceship.h” “,基本上创造了一个无限循环(我尝试过使用#ifndef等没有成功)。

所以,我的问题来了:

  • 是否有可能实现这种结果?
  • 如果不是,我应该如何组织我的代码以避免这类问题?我应该创建一个Screen类,用于存储有关屏幕等的信息,并将其包含在game.h和spaceship.h中吗?

编辑:我找到了克服第一个问题的方法(我刚刚在cpp文件中添加了“game.h”,而不是在头文件中)。但是,我仍然想知道在这种情况下最好的设计选择是什么。

2 个答案:

答案 0 :(得分:2)

如果您只想存储指针或对这些对象的引用,那么您可以使用class Game;class Spaceship;转发声明一个或两个类。如果他们将这些对象作为参数或返回它们(除了一些例外,afaik),这也没关系。

如果你真的希望两者都有另一个的成员,那么可能,因为每个对象都有一个自己的副本。

答案 1 :(得分:0)

您需要在依赖关系图中打破一个循环。

例如,可以向Spaceship类添加一个字段,以保存屏幕高度。