我正在构建一个游戏引擎,并且正在尝试重新组织一些事情。即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。
如果需要对消息进行答复,并且您不想使用同步消息(发件人等待直到接收者处理了消息),那么您应该传递带有消息的回调,并且函子可以在此处出现,函子可以包含对客户的某种引用,因此函子可以将消息发送回去。
如果数量很少且不经常更改的客户端,可以将它们传递给服务器,但是您应该使用由客户端实现的回调接口。