//------------------------------------------------------------------------------ // 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://Ä«¸Þ¶ó°¡ °¢ÀÌÅ©´Ù ij¸¯ÀÌ ¹Ý½Ã°è(¿ÞÂÊ)µ·´Ù { pPlayer->Rotate(fMove); if(g_Camera.GetAngle()<=pPlayer->GetAngle()) { return STATEPROCESS::END; } } break; case TARGET_RIGHT://ÁÖÀΰø°¢ÀÌ Å©´Ù ij¸¯ÀÌ ½Ã°è(¿À¸¥ÂÊ)µ·´Ù { 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; }