将Box2D与SDL中现有的游戏类结构集成在一起?

时间:2011-05-15 09:05:27

标签: c++ sdl box2d

对于这个相当模糊的标题感到抱歉,但它看起来似乎是一个类似的模糊问题,尽管希望足够简洁,有人能够回答它。我花了相当多的时间来研究SDL中2D侧滚动游戏的框架,现在我对这个库感到很舒服,并且有一个工作原型,我希望将Box2D物理库集成到我的游戏中。现在,我不仅仅是首先潜入并且实际上花时间在我的系统上编译库(显然),研究Testbed应用程序,创建我自己的几个以获得它的全部内容。然而,我仍然无法弄清楚如何将它整合到我现有的游戏结构中。下面是我的游戏“引擎”来源的示例,如果我可能如此大胆:

CMain.cpp

// Constructor. Initialize the screen display surface and 
// let the application know that we are running.
CMain::CMain(){
    displaySurface = NULL;
    isRunning = true;
}

// Init function, hooks SDL libraries, configures the display
// surface, window and all pre-runtime environment parts.
int CMain::OnExecute(){


    if(OnInit() == false){
        return -1;
    }

    // Event checking, game loop and render loop. 
    SDL_Event Event;
    while(isRunning){
        while(SDL_PollEvent(&Event)){
            OnEvent(&Event);
        }
        OnLoop();
        OnRender();
    }

    // Cleanup, called when the application is no longer running,
    // handles the removal of all loaded resources from memory.
    OnCleanup();
    return 0;
}

int main(int argc, char* argv[]){
    CMain digIt;
    return digIt.OnExecute();
}

正如您所看到的,它可以处理关键的游戏循环功能。我不认为各种辅助函数的完整代码对于问题的上下文是必要的,但如果它有用,那么我会很高兴发布它。所以,我的问题是:

熟悉Box2D世界的结构及其初始化,步骤和一切,我现在如何将其整合到现有的游戏结构中?我是否希望我的整个CMain类继承b2World? (即,CMain类:b2World {})还有其他一些方法来创造这个世界,以便它可以在全球范围内访问而不会犯下良好编码习惯的主要罪恶吗?例如,我试图在CMain标头中声明一个b2World *指针,然后将其传递给后续函数来处理它们必须做的事情,但这会导致许多空指针异常。如果可能的话,您可以给出的任何建议或示例代码将非常感激!

1 个答案:

答案 0 :(得分:1)

我不建议您的CMain类派生自b2world,因为它绝对不是is-a关系,而是has-a。我不知道它是否是完美的解决方案,因为我不了解你的整体架构,但它似乎是Singleton模式的好地方。

我建议您创建一个实现单例模式的类,该模式包含b2World的中心实例,如CPhysicsService。这个例子是踩踏世界并创造新的身体。由于单例,可以在任何需要的地方检索类的实例。

我在为Gamebryo引擎进行扩展时遇到了这个问题。但无论如何,引擎都是建立在服务之上的,因此Box2D服务的创建是显而易见的。

我希望这在某种程度上有用。