Files
Sun1602/Client/GameClient/State/StateRiderTurn.cpp
T
2022-10-26 12:25:11 +08:00

204 lines
4.8 KiB
C++

//------------------------------------------------------------------------------
// StateSit.cpp
// (C) 2005 Webzen Sunstudio
//------------------------------------------------------------------------------
#include "SunClientPrecompiledHeader.h"
#include "statebase.h"
#include "StateRiderTurn.h"
#include "RidingInfoParser.h"
#include "player.h"
#include "Camera.h"
//------------------------------------------------------------------------------
/**
*/
StateRiderTurn::StateRiderTurn(void)
{
m_nTurnState = -1;
}
//------------------------------------------------------------------------------
/**
*/
StateRiderTurn::~StateRiderTurn(void)
{
}
//------------------------------------------------------------------------------
/**
*/
BOOL StateRiderTurn::CanTransite(Object* pOwner, DWORD CurTime, StateBase* pToTransiteState)
{
switch(pToTransiteState->GetStateKind())
{
case 0:
break;
}
return TRUE;
}
//------------------------------------------------------------------------------
/** 카메라와 주인공은 기본적으로 0~360(의 라디안값을 항상유지한다) WZ_PI * 2
둘사이의 각을 체크해서 어느방향의로 돌릴것인지 체크한다. 빠른쪽방향을 체크한다
*/
void StateRiderTurn::CheckTurnDirection(Player *pPlayer)
{
float fDestAngle = pPlayer->GetAngle();
float fCameraAngle = g_Camera.GetAngle();
int iTurnSTate = TARGET_LEFT;
//카메라가 왼쪽에 있다.
if ( fCameraAngle > fDestAngle)
{
//왼쪽에있어도 180넘어선곳에 있으면 카메라의 방향은 오른쪽이여야한다.
if( fCameraAngle > fDestAngle+WZ_PI)
{
iTurnSTate = TARGET_REVERSE_RIGHT;
}
}
else
{
iTurnSTate = TARGET_RIGHT;
//오른쪽에 카메라가 위치해도 180을 넘어선곳이라면 왼쪽으로 도는게 더빠르다
if( fDestAngle > fCameraAngle+WZ_PI)
{
iTurnSTate = TARGET_REVERSE_LEFT;
}
}
//시작시에는 무조건 셋팅
if(m_nTurnState==-1)
{
if(iTurnSTate==TARGET_LEFT || iTurnSTate==TARGET_REVERSE_LEFT)
{
pPlayer->SetPlayerAnimation(pPlayer->GetCurrentLeftTurnAnimation(),eANI_L_ROTATE,TRUE);
pPlayer->ProcessAnimation(0);
}
else
{
pPlayer->SetPlayerAnimation(pPlayer->GetCurrentRightTurnAnimation(),eANI_R_ROTATE,TRUE);
pPlayer->ProcessAnimation(0);
}
}
else
{
if(m_nTurnState != iTurnSTate)
{
//왼쪽계열일때
if(m_nTurnState==TARGET_LEFT ||m_nTurnState==TARGET_REVERSE_LEFT)
{
if(iTurnSTate==TARGET_RIGHT ||iTurnSTate==TARGET_REVERSE_RIGHT)
{
pPlayer->SetPlayerAnimation(pPlayer->GetCurrentRightTurnAnimation(),eANI_R_ROTATE,TRUE);
pPlayer->ProcessAnimation(0);
}
}
else
{
if(iTurnSTate==TARGET_LEFT ||iTurnSTate==TARGET_REVERSE_LEFT)
{
pPlayer->SetPlayerAnimation(pPlayer->GetCurrentLeftTurnAnimation(),eANI_L_ROTATE,TRUE);
pPlayer->ProcessAnimation(0);
}
}
}
}
m_nTurnState = iTurnSTate;
}
//------------------------------------------------------------------------------
/**
*/
STATECHANGE::TYPE StateRiderTurn::OnStart(Object* pOwner, DWORD CurTime)
{
Player* pPlayer = (Player*)pOwner;
assert(pPlayer->IsKindOfObject(PLAYER_OBJECT));
m_nTurnState = -1;
CheckTurnDirection(pPlayer);
static float fSpeed = 0.0014f;
float fPlusSpeed=0.f;
const sRiderInfo* pRiderInfo = RidingInfoParser::Instance()->GetInfo(pPlayer->GetRiderIdx());
if(pRiderInfo)
{
fPlusSpeed = (float)(pRiderInfo->set_speed_ - 160) /100000.f;
if(fPlusSpeed<0)
{
fPlusSpeed = 0;
}
}
m_fTurnSpeed = fSpeed + fPlusSpeed;
return STATECHANGE::SUCCESS;
}
//------------------------------------------------------------------------------
/**
*/
STATEPROCESS::TYPE StateRiderTurn::OnProcess(Object* pOwner, DWORD CurTime,DWORD dwTick)
{
Player* pPlayer = (Player*)pOwner;
assert(pPlayer->IsKindOfObject(PLAYER_OBJECT));
pPlayer->ProcessInterpolation(dwTick);
pPlayer->ProcessAnimation(dwTick);
float fMove = m_fTurnSpeed * dwTick;
CheckTurnDirection(pPlayer);
switch(m_nTurnState)
{
case TARGET_LEFT://카메라가 각이크다 캐릭이 반시계(왼쪽)돈다
{
pPlayer->Rotate(fMove);
if(g_Camera.GetAngle()<=pPlayer->GetAngle())
{
return STATEPROCESS::END;
}
}
break;
case TARGET_RIGHT://주인공각이 크다 캐릭이 시계(오른쪽)돈다
{
pPlayer->Rotate(-fMove);
if(g_Camera.GetAngle()>=pPlayer->GetAngle())
{
return STATEPROCESS::END;
}
}
break;
case TARGET_REVERSE_LEFT://주인공각이 크지만 왼쪽으로 도는게 더 빠르다
{
pPlayer->Rotate(fMove);
}
break;
case TARGET_REVERSE_RIGHT://카메라 크지만 오른쪽으로 도는게 더 빠르다
{
pPlayer->Rotate(-fMove);
}
break;
}
// 다음 동작이 있으면 바로 수행해주세요~
if (pPlayer->GetActionQueueCount())
{
pPlayer->ProcessNextAction();
return STATEPROCESS::SUSPEND;
}
return STATEPROCESS::SUSPEND;
}
//------------------------------------------------------------------------------
/**
*/
STATECHANGE::TYPE StateRiderTurn::OnEnd(Object* pOwner, DWORD CurTime)
{
m_nTurnState = -1;
return STATECHANGE::SUCCESS;
}