move message helper stuff out of Actor into a new base class so that it can be used w/o deriving from Actor

This commit is contained in:
Chris Danford
2006-02-06 01:26:52 +00:00
parent b03b2dc768
commit a05d1e8265
4 changed files with 68 additions and 49 deletions
+3 -23
View File
@@ -89,7 +89,7 @@ void Actor::InitDefaults()
m_bZWrite = false; m_bZWrite = false;
m_CullMode = CULL_NONE; m_CullMode = CULL_NONE;
UnsubcribeAndClearCommands(); UnsubscribeAll();
} }
static bool GetMessageNameFromCommandName( const RString &sCommandName, RString &sMessageNameOut ) static bool GetMessageNameFromCommandName( const RString &sCommandName, RString &sMessageNameOut )
@@ -105,13 +105,6 @@ static bool GetMessageNameFromCommandName( const RString &sCommandName, RString
} }
} }
void Actor::UnsubcribeAndClearCommands()
{
FOREACH_CONST( RString, m_vsSubscribedTo, s )
MESSAGEMAN->Unsubscribe( this, *s );
m_vsSubscribedTo.clear();
}
Actor::Actor() Actor::Actor()
{ {
m_pLuaInstance = new LuaClass; m_pLuaInstance = new LuaClass;
@@ -123,11 +116,11 @@ Actor::Actor()
Actor::~Actor() Actor::~Actor()
{ {
StopTweening(); StopTweening();
UnsubcribeAndClearCommands(); UnsubscribeAll();
} }
Actor::Actor( const Actor &cpy ): Actor::Actor( const Actor &cpy ):
IMessageSubscriber( cpy ) MessageSubscriber( cpy )
{ {
/* Don't copy an Actor in the middle of rendering. */ /* Don't copy an Actor in the middle of rendering. */
ASSERT( cpy.m_pTempState == NULL ); ASSERT( cpy.m_pTempState == NULL );
@@ -183,7 +176,6 @@ Actor::Actor( const Actor &cpy ):
CPY( m_CullMode ); CPY( m_CullMode );
CPY( m_mapNameToCommands ); CPY( m_mapNameToCommands );
CPY( m_vsSubscribedTo );
#undef CPY #undef CPY
} }
@@ -1278,18 +1270,6 @@ void Actor::HandleMessage( const RString& sMessage )
PlayCommand( sMessage ); PlayCommand( sMessage );
} }
void Actor::SubscribeToMessage( const RString &sMessageName )
{
MESSAGEMAN->Subscribe( this, sMessageName );
m_vsSubscribedTo.push_back( sMessageName );
}
void Actor::SubscribeToMessage( Message message )
{
MESSAGEMAN->Subscribe( this, message );
m_vsSubscribedTo.push_back( MessageToString(message) );
}
Actor::TweenInfo::TweenInfo() Actor::TweenInfo::TweenInfo()
{ {
m_pTween = NULL; m_pTween = NULL;
+1 -6
View File
@@ -22,14 +22,13 @@ class LuaClass;
#define DRAW_ORDER_TRANSITIONS +110 #define DRAW_ORDER_TRANSITIONS +110
#define DRAW_ORDER_AFTER_EVERYTHING +200 #define DRAW_ORDER_AFTER_EVERYTHING +200
class Actor : public IMessageSubscriber class Actor : public MessageSubscriber
{ {
public: public:
Actor(); Actor();
Actor( const Actor &cpy ); Actor( const Actor &cpy );
virtual ~Actor(); virtual ~Actor();
virtual Actor *Copy() const; virtual Actor *Copy() const;
void UnsubcribeAndClearCommands();
virtual void LoadFromNode( const RString& sDir, const XNode* pNode ); virtual void LoadFromNode( const RString& sDir, const XNode* pNode );
bool IsType( const RString &sType ); bool IsType( const RString &sType );
@@ -346,11 +345,8 @@ public:
// //
// Messages // Messages
// //
void SubscribeToMessage( Message message ); // will automatically unsubscribe
void SubscribeToMessage( const RString &sMessageName ); // will automatically unsubscribe
virtual void HandleMessage( const RString& sMessage ); virtual void HandleMessage( const RString& sMessage );
// //
// Animation // Animation
// //
@@ -465,7 +461,6 @@ private:
// commands // commands
// //
map<RString, apActorCommands> m_mapNameToCommands; map<RString, apActorCommands> m_mapNameToCommands;
vector<RString> m_vsSubscribedTo;
}; };
#endif #endif
+24
View File
@@ -193,6 +193,30 @@ void IMessageSubscriber::ProcessMessages( float fDeltaTime )
g_Mutex.Unlock(); g_Mutex.Unlock();
} }
MessageSubscriber::MessageSubscriber( const MessageSubscriber &cpy )
{
m_vsSubscribedTo = cpy.m_vsSubscribedTo;
}
void MessageSubscriber::SubscribeToMessage( const RString &sMessageName )
{
MESSAGEMAN->Subscribe( this, sMessageName );
m_vsSubscribedTo.push_back( sMessageName );
}
void MessageSubscriber::SubscribeToMessage( Message message )
{
MESSAGEMAN->Subscribe( this, message );
m_vsSubscribedTo.push_back( MessageToString(message) );
}
void MessageSubscriber::UnsubscribeAll()
{
FOREACH_CONST( RString, m_vsSubscribedTo, s )
MESSAGEMAN->Unsubscribe( this, *s );
m_vsSubscribedTo.clear();
}
// lua start // lua start
#include "LuaBinding.h" #include "LuaBinding.h"
+40 -20
View File
@@ -3,26 +3,6 @@
#ifndef MessageManager_H #ifndef MessageManager_H
#define MessageManager_H #define MessageManager_H
class IMessageSubscriber
{
public:
virtual ~IMessageSubscriber() { }
virtual void HandleMessage( const RString& sMessage ) = 0;
virtual void ProcessMessages( float fDeltaTime );
void ClearMessages( const RString sMessage = "" );
private:
struct QueuedMessage
{
RString sMessage;
float fDelayRemaining;
};
void HandleMessageInternal( const RString& sMessage );
vector<QueuedMessage> m_aMessages;
friend class MessageManager;
};
struct lua_State; struct lua_State;
enum Message enum Message
@@ -86,6 +66,46 @@ enum Message
}; };
const RString& MessageToString( Message m ); const RString& MessageToString( Message m );
class IMessageSubscriber
{
public:
virtual ~IMessageSubscriber() { }
virtual void HandleMessage( const RString& sMessage ) = 0;
virtual void ProcessMessages( float fDeltaTime );
void ClearMessages( const RString sMessage = "" );
private:
struct QueuedMessage
{
RString sMessage;
float fDelayRemaining;
};
void HandleMessageInternal( const RString& sMessage );
vector<QueuedMessage> m_aMessages;
friend class MessageManager;
};
class MessageSubscriber : public IMessageSubscriber
{
public:
MessageSubscriber() {}
MessageSubscriber( const MessageSubscriber &cpy );
//
// Messages
//
void SubscribeToMessage( Message message ); // will automatically unsubscribe
void SubscribeToMessage( const RString &sMessageName ); // will automatically unsubscribe
void UnsubscribeAll();
private:
vector<RString> m_vsSubscribedTo;
};
class MessageManager class MessageManager
{ {
public: public: