我正在构建一个游戏引擎,并且正在尝试重新组织一些事情。即EngineManager,它管理引擎的主要组件(音频,视频,键盘/鼠标IO等)。

如果需要的话,此清理的主要实现思想是使用EngineManager作为客户端,该客户端将通过事件处理(在SDL中)将数据发送到这些各个组件,这些组件随后又将消息发回。为了避免精神错乱,我有以下实现:

设定档

    class Config
    {
    public:

        Config( const EngineManager* engine, const Controls* controls );

        ~Config( void );

        //More functions

    private:

        Controls** mControls;

        EngineManager** mEngine;

        //More functions/class members

    };

    Config::Config( const EngineManager* engine, const Controls* controls )
        : mControls( controls ),
          mEngine( engine ),
          mIsInitialized( false )
    {
    }

    Config::~Config( void )
    {
        delete mControls;
        delete mEngine;
    }


引擎管理员

class EngineManager
{

public:

    EngineManager( void );

    ~EngineManager( void );

    //More functions/class members

private:

    Controls* mControls;

    Config* mConfig;

   //More functions/class members

};

EngineManager::EngineManager( void )
    : mControls( new Controls( this ) ),
      mConfig( new Config( this, mControls ) ),
      mEvent( new SDL_Event )
{
    Init();
}

EngineManager::~EngineManager( void )
{
    delete mEvent;
    delete mConfig;
    delete mControls;
    delete mScreen;
}


我会发布控件,但是它基本上与config类做相同的事情-尽管没有引用config。

仍然有东西告诉我,一个好的实现可能是某种函数指针……

有任何想法吗?

最佳答案

这里最大的设计问题是相互依赖。如果使用客户端/服务器,则客户端应取决于服务器,而不是相反。

如果客户端需要了解服务器中的更新,则应使用observer pattern
如果需要对消息进行答复,并且您不想使用同步消息(发件人等待直到接收者处理了消息),那么您应该传递带有消息的回调,并且函子可以在此处出现,函子可以包含对客户的某种引用,因此函子可以将消息发送回去。
如果数量很少且不经常更改的客户端,可以将它们传递给服务器,但是您应该使用由客户端实现的回调接口。

08-26 19:43
查看更多