//actor.cpp
#include <stdio.h>
#include <iostream>
//actor »óŸ¦ state ÆÐÅÏÀ¸·Î ±¸ÇöÇØ º»´Ù.
class IState;
class ActorStandState;
class ActorJumpState;
class ActorFallState;
//--------------------------------------------------------
class IContext
{
public:
IContext() { m_pState = NULL; }
virtual ~IContext();
virtual void ChangeState( IState* pNextState );
virtual void SetAnimation( const char* szAnimation ) = 0;
virtual float GetJumpHeight() = 0;
protected:
IState* m_pState;
};
class IState
{
public:
virtual void Enter( IContext* pContext ) = 0;
virtual void Exit( IContext* pContext ) = 0;
virtual void Execute( IContext* pContext ) = 0;
};
//--------------------------------------------------------
IContext::~IContext()
{
if( m_pState )
{
delete m_pState;
m_pState = NULL;
}
}
//--------------------------------------------------------
void IContext::ChangeState( IState* pNextState )
{
if( m_pState )
{
m_pState->Exit( this );
delete m_pState;
}
m_pState = pNextState;
m_pState->Enter( this );
}
class ActorStandState : public IState
{
public:
void Enter( IContext* pContext )
{
pContext->SetAnimation( "stand" );
}
void Exit( IContext* pContext )
{
}
void Execute( IContext* pContext );
};
//--------------------------------------------------------
class ActorJumpState : public IState
{
public:
void Enter( IContext* pContext )
{
pContext->SetAnimation( "jump" );
}
void Exit( IContext* pContext )
{
}
void Execute( IContext* pContext );
};
//--------------------------------------------------------
class ActorFallState : public IState
{
public:
void Enter( IContext* pContext )
{
pContext->SetAnimation( "fall" );
}
void Exit( IContext* pContext )
{
}
void Execute( IContext* pContext );
};
//--------------------------------------------------------
void ActorStandState::Execute( IContext* pContext )
{
std::cout << "ActorStandState" << std::endl;
if( pContext->GetJumpHeight() >= 0.1f ) //Á¡ÇÁ ½ÃÀÛ
pContext->ChangeState( new ActorJumpState );
}
//--------------------------------------------------------
void ActorJumpState::Execute( IContext* pContext )
{
std::cout << "ActorJumpState" << std::endl;
if( pContext->GetJumpHeight() >= 1.0f ) //actor´Â ÃÖ°í 1¹ÌÅͱîÁö Á¡ÇÁÇÑ´Ù.
pContext->ChangeState( new ActorFallState );
}
//--------------------------------------------------------
void ActorFallState::Execute( IContext* pContext )
{
std::cout << "ActorFallState" << std::endl;
if( pContext->GetJumpHeight() <= 0.0f )
pContext->ChangeState( new ActorStandState );
}
//--------------------------------------------------------
class Actor : public IContext
{
public:
Actor()
{
m_height = 0.0f;
}
void SetAnimation( const char* szAnimation ) {};
float GetJumpHeight() { return m_height; }
void SetJumpHiehgt( float height ) { m_height = height; }
void Update()
{
m_pState->Execute( this );
}
float m_height;
};
void main()
{
Actor actor;
actor.ChangeState( new ActorStandState );
float height = 0.0f;
for( ; height <= 1.0f; height += 0.3f )
{
actor.SetJumpHiehgt( height );
actor.Update();
}
for( ; height >= 0.0f; height -= 0.3f )
{
actor.SetJumpHiehgt( height );
actor.Update();
}
actor.Update();
}