【问题标题】:Organization of code for a game using SDL使用 SDL 组织游戏的代码
【发布时间】:2012-01-13 21:19:30
【问题描述】:

我已经使用 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 等但没有成功)。

有没有可能达到这样的效果?

编辑:我找到了解决问题的方法(我只是在 cpp 文件中而不是在头文件中添加了“game.h”包含)。

【问题讨论】:

  • 我通常通过避免“主游戏类”来解决“主游戏类”问题。解决这个问题的一种方法是让你的 main 函数 实例化你需要的所有项目,然后使用依赖注入将每个类需要的位传递给每个类,而不是依赖于静态状态(有效全局变量)。
  • “我如何设计一个项目”是一个相当广泛的问题,但你基本上做对了(在做一个学习项目时,设计代码的方式真的没有对错之分)
  • @MerlynMorgan-Graham 谢谢,我也会评估这种方法

标签: c++ sdl


【解决方案1】:

如果您只想存储指向这些对象的指针或引用,则可以使用class Game;class Spaceship; 前向声明一个或两个类。如果他们将这些对象作为参数或返回它们也很好(有一些例外,afaik)。

如果您确实希望两者都拥有另一个成员,那么这是不可能的,因为每个对象内部都会有自己的副本。

【讨论】:

  • 我不知道接收或返回不完整类型有任何异常。
【解决方案2】:

您需要打破依赖关系图中的循环。

例如,可以在 Spaceship 类中添加一个字段,以节省屏幕高度。

【讨论】:

  • 我已经考虑过了,但是如果我想在游戏过程中更改屏幕分辨率,那将是一个问题。
猜你喜欢
  • 2020-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多