cc2974edb6
without the screen knowing about it. That's not always feasible, for actors with more complicated interactions, such as SSMusic's MusicWheel, Banner, and so on. However, if we instance those from the screen itself, then it's pulled outside of the standard XML heirarchy: it has to go around the major layers (overlay, underlay). That's a pain. Create ActorProxy. This simply points to and draws another actor. To use, hide the main actor (hidden,1), create an ActorProxy in XML, and point it at the actor you want. The actor is still controlled by and owned by the screen, but can be layered in any place, and instanced multiple times. (This does not propagate things like ActorFrame; that would cause the target actor to be updated and receive commands multiple times, once for each proxy. The owner, and path for those calls, is still the screen.)
94 lines
2.5 KiB
C++
94 lines
2.5 KiB
C++
#include "global.h"
|
|
#include "ActorProxy.h"
|
|
#include "ActorUtil.h"
|
|
|
|
REGISTER_ACTOR_CLASS( ActorProxy )
|
|
|
|
ActorProxy::ActorProxy()
|
|
{
|
|
m_pActorTarget = NULL;
|
|
}
|
|
|
|
bool ActorProxy::EarlyAbortDraw() const
|
|
{
|
|
return m_pActorTarget == NULL || Actor::EarlyAbortDraw();
|
|
}
|
|
|
|
void ActorProxy::DrawPrimitives()
|
|
{
|
|
if( m_pActorTarget != NULL )
|
|
{
|
|
bool bHidden = m_pActorTarget->GetHidden();
|
|
m_pActorTarget->SetHidden( false );
|
|
m_pActorTarget->Draw();
|
|
m_pActorTarget->SetHidden( bHidden );
|
|
}
|
|
}
|
|
|
|
void ActorProxy::LoadFromNode( const RString& sDir, const XNode* pNode )
|
|
{
|
|
Actor::LoadFromNode( sDir, pNode );
|
|
}
|
|
|
|
// lua start
|
|
#include "LuaBinding.h"
|
|
|
|
class LunaActorProxy: public Luna<ActorProxy>
|
|
{
|
|
public:
|
|
LunaActorProxy() { LUA->Register( Register ); }
|
|
|
|
static int SetTarget( T* p, lua_State *L )
|
|
{
|
|
Actor *pTarget = Luna<Actor>::check( L, 1 );
|
|
p->SetTarget( pTarget );
|
|
return 0;
|
|
}
|
|
|
|
static int GetTarget( T* p, lua_State *L )
|
|
{
|
|
Actor *pTarget = p->GetTarget();
|
|
if( pTarget != NULL )
|
|
pTarget->PushSelf( L );
|
|
else
|
|
lua_pushnil( L );
|
|
return 1;
|
|
}
|
|
|
|
static void Register(lua_State *L)
|
|
{
|
|
ADD_METHOD( SetTarget );
|
|
ADD_METHOD( GetTarget );
|
|
|
|
Luna<T>::Register( L );
|
|
}
|
|
};
|
|
|
|
LUA_REGISTER_DERIVED_CLASS( ActorProxy, Actor )
|
|
// lua end
|
|
|
|
/*
|
|
* (c) 2006 Glenn Maynard
|
|
* All rights reserved.
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
|
* copy of this software and associated documentation files (the
|
|
* "Software"), to deal in the Software without restriction, including
|
|
* without limitation the rights to use, copy, modify, merge, publish,
|
|
* distribute, and/or sell copies of the Software, and to permit persons to
|
|
* whom the Software is furnished to do so, provided that the above
|
|
* copyright notice(s) and this permission notice appear in all copies of
|
|
* the Software and that both the above copyright notice(s) and this
|
|
* permission notice appear in supporting documentation.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
|
|
* THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS
|
|
* INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT
|
|
* OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
|
|
* OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
* PERFORMANCE OF THIS SOFTWARE.
|
|
*/
|