我正在处理事件的游戏引擎组件。我想要做的是创建一个系统,我可以通过名称注册新的事件类型。然后,事件管理器将持有一系列事件类型和工厂来生成这样的事件类型,但是我想让它使用一个池化系统,以便创建一个事件,然后使用它,然后而不是删除它,把它列入一个列表。下一次我创建该事件,而不是使用堆,我可以从池中分配。模板抽象工厂类与池
SO特定事件类型的这些层次...
struct TEvent
{
int nID;
int nTimeStamp;
};
struct TCollisionEvent : public TEvent
{
TEntity* pEntity1;
TEntity* pEntity2;
Vector3* pvecPoint;
};
然后我创建了一个智能工厂,这是否创建/循环的竞争操作:
template <class BASE_CLASS>
class CSmartFactory
{
private:
typedef typename std::list<BASE_CLASS*> TBaseList;
typedef typename std::list<BASE_CLASS*>::iterator TBaseListItr;
TBaseList* m_plstPool;
public:
explicit CSmartFactory()
{
m_plstPool = NULL;
}
~CSmartFactory()
{
TBaseListItr itr;
if (m_plstPool)
{
for (itr = m_plstPool->begin(); itr != m_plstPool->end(); itr++)
{
BASE_CLASS* pEntity = *itr;
SAFE_DELETE(pEntity);
}
m_plstPool->clear();
SAFE_DELETE(m_plstPool);
}
}
bool Init(int nPoolSize)
{
bool bReturn = false;
do
{
m_plstPool = new TBaseList;
IwAssert(MAIN, m_plstPool);
while (nPoolSize--)
{
BASE_CLASS* pBaseObject = new BASE_CLASS;
IwAssert(MAIN, pBaseObject);
m_plstPool->push_back(pBaseObject);
}
bReturn = true;
} while(0);
return bReturn;
}
BASE_CLASS* Create()
{
BASE_CLASS* pBaseObject = NULL;
//
// grab a pre-made entity from the pool or allocate a new one
if (m_plstPool->size() > 0)
{
pBaseObject = m_plstPool->front();
m_plstPool->pop_front();
pBaseObject->Clear();
}
else
{
pBaseObject = new BASE_CLASS;
IwAssert(MAIN, pBaseObject);
}
return pBaseObject;
}
void Recycle(BASE_CLASS* pBaseObject)
{
m_plstPool->push_back(pBaseObject);
}
};
所以,现在我可以这样做:
CSmartFactory<TCollisionEvent>* pCollisionEventFactory = new CSmartFactory<TCollisionEvent>;
但是我想要做的是让我的事件管理器允许动态事件注册bu这就是我陷入困境的地方。
理想情况下,RegisterEvent会追踪stl :: map或其他东西的名称和工厂指针,但不太清楚如何到达那一点。也许我完全走错了路。
这将编译
class TEventManager
{
public:
TEventManager();
~TEventManager();
bool RegisterEvent(char* pszEventName, CSmartFactory<TEvent>* pFactory);
};
在您添加
TEventManager::RegisterEvent("CollisionEvent", new CSmartFactory<TEntityCollisionEvent>);
所以现在我绝望地试图找到一种方法,使这一切工作。
有人在这里有一些想法!?
Fred
正确,我非常想避免昂贵的malloc/free的。 唯一的问题是,我正在使用的这个特定平台不支持增强,因此我试图把我自己放在一起。 我觉得我走在正确的道路上! – Fred 2011-03-24 02:05:33
我可以问......你的特定平台是什么? – 2011-03-24 02:10:00
使用AirPlay SDK,因此它是一个受限制的系统,并且他们没有提升的官方支持,尽管有些人在各种部分被黑客入侵。 – Fred 2011-03-24 02:12:52