move code out of macro
move common code into ActorUtil::Create
This commit is contained in:
@@ -40,8 +40,14 @@ Actor* ActorUtil::Create( const RString& sClassName, const XNode* pNode, Actor *
|
|||||||
map<RString,CreateActorFn>::iterator iter = g_pmapRegistrees->find( sClassName );
|
map<RString,CreateActorFn>::iterator iter = g_pmapRegistrees->find( sClassName );
|
||||||
ASSERT_M( iter != g_pmapRegistrees->end(), ssprintf("Actor '%s' is not registered.",sClassName.c_str()) );
|
ASSERT_M( iter != g_pmapRegistrees->end(), ssprintf("Actor '%s' is not registered.",sClassName.c_str()) );
|
||||||
|
|
||||||
CreateActorFn pfn = iter->second;
|
const CreateActorFn &pfn = iter->second;
|
||||||
return (*pfn)( pNode, pParentActor );
|
Actor *pRet = pfn();
|
||||||
|
|
||||||
|
if( pParentActor )
|
||||||
|
pRet->SetParent( pParentActor );
|
||||||
|
|
||||||
|
pRet->LoadFromNode( pNode );
|
||||||
|
return pRet;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ActorUtil::ResolvePath( RString &sPath, const RString &sName )
|
void ActorUtil::ResolvePath( RString &sPath, const RString &sName )
|
||||||
|
|||||||
@@ -8,19 +8,15 @@
|
|||||||
|
|
||||||
class XNode;
|
class XNode;
|
||||||
|
|
||||||
typedef Actor* (*CreateActorFn)(const XNode* pNode, Actor* pParent);
|
typedef Actor* (*CreateActorFn)();
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
Actor *CreateActor() { return new T; }
|
||||||
|
|
||||||
// Each Actor class should have a REGISTER_ACTOR_CLASS in its CPP file.
|
// Each Actor class should have a REGISTER_ACTOR_CLASS in its CPP file.
|
||||||
#define REGISTER_ACTOR_CLASS_WITH_NAME( className, externalClassName ) \
|
#define REGISTER_ACTOR_CLASS_WITH_NAME( className, externalClassName ) \
|
||||||
Actor* Create##className(const XNode* pNode, Actor* pParent) { \
|
struct Register##className { \
|
||||||
className *pRet = new className; \
|
Register##className() { ActorUtil::Register(#externalClassName, CreateActor<className>); } \
|
||||||
if( pParent ) \
|
|
||||||
pRet->SetParent( pParent ); \
|
|
||||||
pRet->LoadFromNode(pNode); \
|
|
||||||
return pRet; } \
|
|
||||||
class Register##className { \
|
|
||||||
public: \
|
|
||||||
Register##className() { ActorUtil::Register(#externalClassName,Create##className); } \
|
|
||||||
}; \
|
}; \
|
||||||
static Register##className register##className; \
|
static Register##className register##className; \
|
||||||
Actor *className::Copy() const { return new className(*this); }
|
Actor *className::Copy() const { return new className(*this); }
|
||||||
|
|||||||
Reference in New Issue
Block a user