本文整理汇总了C++中CMover::GetAngle方法的典型用法代码示例。如果您正苦于以下问题:C++ CMover::GetAngle方法的具体用法?C++ CMover::GetAngle怎么用?C++ CMover::GetAngle使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类CMover
的用法示例。
在下文中一共展示了CMover::GetAngle方法的9个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: if
FOR_LINKMAP( GetWorld(), vPos, pObj, nRange, CObj::linkPlayer, GetLayer() )
{
if( pObj->GetType() == OT_MOVER ) // 대상이 무버일때만.
{
CMover *pTarget = (CMover *)pObj;
if( pTarget->IsLive() && pAttacker != pTarget )
{
if( pObj->IsRangeObj( vPos, 1.0f ) )
{
#if __VER >= 9 // __SKILL_0706
int n = 0;
if( bPVP && pAttacker->IsPVPTarget( pTarget ) )
n = pTarget->m_pActMover->SendDamage( AF_FORCE, pAttacker->GetId(), nDamagePVP, FALSE );
else if( bPVP && (m_bControl || pAttacker->IsGuildCombatTarget( pTarget )
/*아레나 추가*/ || pAttacker->IsArenaTarget( pTarget )
) )
n = pTarget->m_pActMover->SendDamage( AF_FORCE, pAttacker->GetId(), nDamage, FALSE );
#else // __SKILL_0706
int n = pTarget->m_pActMover->SendDamage( AF_FORCE, pAttacker->GetId(), nDamage, FALSE );
#endif // __SKILL_0706
if( n > 0 )
{
m_nLife ++; // 부딪힐때마다 카운트 올라감
if( m_nLife >= (int)( m_pAddSkillProp->dwSkillLvl / 2 ) )
DestroyWall();
// 뒤로 밀리기 처리.
FLOAT fPushAngle = pTarget->GetAngle() + 180.0f;
FLOAT fPower = 0.825f;
AngleToVectorXZ( &pTarget->m_pActMover->m_vDeltaE, fPushAngle, fPower );
g_UserMng.AddPushPower( pTarget, pTarget->GetPos(), pTarget->GetAngle(), fPushAngle, fPower );
}
}
}
}
}
示例2: if
//.........这里部分代码省略.........
CMover *pSelectMover = prj.GetMover( idSelect );
if( IsValidObj(pSelectMover) )
{
CWorld *pWorld = pMover->GetWorld();
if( pWorld )
{
pWorld->SetObjFocus( pSelectMover ); // 이놈을 타겟으로 설정함.
pMover->m_idTracking = pSelectMover->GetId(); // 탭으로 타겟을 바꾸면 자동추적타겟도 그놈으로 바뀐다.
}
}
}
}
s_bSelectKeyed = g_bKeyTable[VK_TAB];
}
if( /*m_bFlyMove &&*/ m_bLButtonDown || g_bKeyTable[VK_INSERT] ) // 192 = `
{
CObj *pObj = pMover->GetWorld()->GetObjFocus(); // 타겟잡힌놈이 있을때만 휘두를수 있다.
if( pObj && pObj->GetType() == OT_MOVER )
{
if( pMover->IsAttackAble( pObj ) ) // 공격 가능한지 검사.
{
OBJID idTarget = ((CMover *)pObj)->GetId();
ItemProp *pWeapon = pMover->GetActiveHandItemProp();
if( pWeapon )
{
g_pPlayer->PlayCombatMusic();
if( pWeapon->dwItemKind3 == IK3_WAND )
{
D3DXVECTOR3 vFront, vTarget;
AngleToVector( &vFront, g_pPlayer->GetAngle(), -g_pPlayer->GetAngleX(), 1.0f );
vTarget = pObj->GetPos() - g_pPlayer->GetPos();
D3DXVec3Normalize( &vTarget, &vTarget ); // 타겟쪽으로의 벡터의 유닛벡터.
FLOAT fDot = D3DXVec3Dot( &vFront, &vTarget );
if( fDot >= cosf(D3DXToRadian(60.0f)) ) // 타겟이 내가 보는 방향의 +-30도 안에 있으면 발사할수 있다.
{
if( pMover->IsRangeObj( pObj, 64.0f ) ) // 사정거리에 들어오면 발사.
{
pMover->DoAttackMagic( pObj, 0 );
}
}
}
else
{
pMover->SendActMsg( OBJMSG_ATK1, idTarget );
}
}
}
}
}
// fTurnAngle = 0.6f;
ItemProp* pItemProp = prj.GetItemProp( g_pPlayer->GetRideItemIdx() );
if( pItemProp )
{
fTurnAngle = pItemProp->fFlightLRAngle;
}
else
{
Error( "ControlFlying : 빗자루정보 읽기 실패 %d", g_pPlayer->GetRideItemIdx() );
fTurnAngle = 0.6f;
}
示例3: cosf
void CActionMover::ProcessFlyMove( void )
{
#ifdef __CLIENT
g_nDrift = 0; // 드리프트 플랙 클리어
#endif
float fLenSq = D3DXVec3LengthSq( &m_vDelta );
if( fLenSq == 0.0f && (GetStateFlag() & OBJSTAF_ACC ) == 0 )
return; // 멈춤 상태면 리턴
CMover* pMover = m_pMover;
FLOAT fAccPwr = m_fAccPower;
#ifdef __CLIENT
ProcessFlyTracking();
#endif // client
// 터보모드 처리
if( (GetStateFlag() & OBJSTAF_TURBO) && (GetStateFlag() & OBJSTAF_ACC) ) // 터보모드 & 전진중
{
#ifdef __WORLDSERVER
pMover->m_tmAccFuel = (int)( pMover->m_tmAccFuel - (1000.0f / (float)FRAME_PER_SEC) ); // 1/60만큼 깎음
#endif
if( pMover->m_tmAccFuel <= 0 ) // 가속연료가 다 떨어지면
{
pMover->m_tmAccFuel = 0;
SendActMsg( OBJMSG_MODE_TURBO_OFF ); // 터보모드 중지
#ifdef __WORLDSERVER
g_UserMng.AddSendActMsg( pMover, OBJMSG_MODE_TURBO_OFF );
#endif
}
else
fAccPwr *= 1.2f; // 가속연료가 남아있다면 터보모드
}
#ifdef __CLIENT
ProcessFlyParticle( fLenSq );
#endif
// 관성처리
if( fAccPwr > 0.0f )
{
// 힘벡터 생성
FLOAT fAngX = D3DXToRadian( pMover->GetAngleX() );
FLOAT fAng = D3DXToRadian( pMover->GetAngle() );
FLOAT fDist = cosf(fAngX) * fAccPwr;
D3DXVECTOR3 vAcc;
vAcc.x = sinf( fAng ) * fDist;
vAcc.z = -cosf( fAng ) * fDist;
vAcc.y = -sinf( fAngX ) * fAccPwr;
// 관성벡터와 추진력벡터가 각도가 50도 이하면 급추진
if( fLenSq > 0.01f )
{
D3DXVECTOR3 vDeltaNorm, vAccNorm;
D3DXVec3Normalize( &vDeltaNorm, &m_vDelta );
D3DXVec3Normalize( &vAccNorm, &vAcc );
float fDot = D3DXVec3Dot( &vDeltaNorm, &vAccNorm );
if( fDot < 0.633319f ) // 이전코드: cosf(70.0f) 값으로는 대략 50도
{
vAcc *= 2.0f;
m_vDelta *= 0.985f;
#ifdef __CLIENT
g_nDrift = 1;
if( ! ( pMover->IsMode( TRANSPARENT_MODE ) ) ) // 투명상태가 아닐때만 렌더.
{
if( (g_nProcessCnt & 3) == 0 )
CreateSfx( g_Neuz.m_pd3dDevice, XI_NAT_DUST_RUN, pMover->GetPos() );
}
#endif
}
}
fLenSq = D3DXVec3LengthSq( &m_vDelta ); // 1/60 sec 속도
float fMaxSpeed = 0.3f;
if( GetStateFlag() & OBJSTAF_TURBO ) // 터보모드에선 MAX속도가 1.1배
fMaxSpeed *= 1.1f;
if( fLenSq < (fMaxSpeed * fMaxSpeed) ) // 일정이상 속도를 넘지 않게 하자.
m_vDelta += vAcc; // 관성벡터 += 추진력벡터
}
m_vDelta *= (1.0f - FRIC_AIR); // 마찰력에 의한 감소
// raiders - 수치적 안정성을 위해서 적은 수치가 계산되는 것을 피한다.
fLenSq = D3DXVec3LengthSq( &m_vDelta );
if( m_fAccPower == 0.0f && fLenSq < 0.0002f * 0.0002f )
{
fLenSq = 0;
m_vDelta = D3DXVECTOR3( 0.0f, 0.0f, 0.0f );
RemoveStateFlag( OBJSTAF_ACC ); // 가속상태 해제
}
#ifdef __CLIENT
if( pMover->IsActiveMover() )
{
g_nFlySpeed = (int)( (sqrt(fLenSq) * 60.0f) * 60.0f * 60.0f );
g_nFlySpeed = (int)( g_nFlySpeed / 200.0f );
//.........这里部分代码省略.........
示例4: _ProcessWall
// 싸이킥 월
void CCommonCtrl::_ProcessWall( void )
{
if( m_nCount == 0 )
{
#ifdef __CLIENT
m_pSfxModel = new CSfxModel;
m_pSfxModel2 = new CSfxModel;
m_pSfxModel->SetSfx( "sfx_sklpsypsychicwall02" );
m_pSfxModel2->SetSfx( "sfx_sklpsypsychicwall04" );
#endif
}
D3DXVECTOR3 vPos = GetPos();
#ifndef __CLIENT
CObj* pObj;
BOOL bApply;
#endif //__CLIENT
int nRange = 4;
// 일반적으로 fDepth가 가장 길기때문에 검사 영역은 fDepth로 했다.
float fDepth = 3;
if( fDepth <= 4.0f ) nRange = 4;
else if( fDepth <= 8.0f ) nRange = 8;
else if( fDepth <= 16.0f ) nRange = 16;
else nRange = 32;
#ifdef __WORLDSERVER
CMover *pAttacker = prj.GetMover( m_idAttacker );
if( IsInvalidObj( pAttacker ) ) // 일단 어태커가 사라지면 컨트롤도 사라지게 하자.
{
DestroyWall();
return;
}
int nMin = m_pAddSkillProp->dwAbilityMin + (pAttacker->GetLevel() + (pAttacker->GetInt() / 10) * (int)m_pAddSkillProp->dwSkillLvl);
int nMax = m_pAddSkillProp->dwAbilityMax + (pAttacker->GetLevel() + (pAttacker->GetInt() / 10) * (int)m_pAddSkillProp->dwSkillLvl);
int nDamage = xRandom( nMin, nMax );
#if __VER >= 9 // __SKILL_0706
int nMinPVP = m_pAddSkillProp->dwAbilityMinPVP + ( pAttacker->GetLevel() + ( pAttacker->GetInt() / 10 ) * (int)m_pAddSkillProp->dwSkillLvl );
int nMaxPVP = m_pAddSkillProp->dwAbilityMaxPVP + ( pAttacker->GetLevel() + ( pAttacker->GetInt() / 10 ) * (int)m_pAddSkillProp->dwSkillLvl );
int nDamagePVP = xRandom( nMinPVP, nMaxPVP );
#endif // __SKILL_0706
int nHitPoint = 0;
int nTargetHP = 0;
FOR_LINKMAP( GetWorld(), vPos, pObj, nRange, CObj::linkDynamic, GetLayer() )
{
bApply = FALSE;
if( pObj->GetType() == OT_MOVER ) // 대상이 무버일때만.
{
CMover *pTarget = (CMover *)pObj;
if( pTarget->IsPeaceful() == FALSE ) // NPC가 아닌경우만 적용
bApply = TRUE;
#if __VER >= 8 // #ifdef __JHMA_VER_8_5_1 // 8.5차 경비병 범위스킬 공격효과 불가로 수정 World
if( pAttacker->IsPlayer() && pAttacker->IsChaotic() == FALSE && pTarget->GetProp()->dwClass == RANK_GUARD )
bApply = FALSE;
#endif // #endif // __JHMA_VER_8_5_1 // 8.5차 경비병 범위스킬 공격효과 불가로 수정 World
if( bApply )
{
if( IsValidObj( pTarget ) && pTarget->IsLive() )
{
if( pObj->IsRangeObj( vPos, 1.0f ) )
{
if( IsValidObj(pAttacker) )
{
nTargetHP = pTarget->GetHitPoint();
nHitPoint = nTargetHP - nDamage;
if( nHitPoint > 0 )
{
pTarget->m_nHitPoint = nHitPoint;
g_UserMng.AddDamage( pTarget, pAttacker->GetId(), nDamage, AF_GENERIC );
}
else
{
pAttacker->SubExperience( pTarget ); // pTarget를 죽이고 난후의 m_pAttacker 경험치 처리.
pTarget->DropItemByDied( pAttacker ); // 몬스터였다면 아이템 드랍.
pAttacker->m_nAtkCnt = 0; // 타겟을 죽였으면 공격자의 어택카운트 클리어
pTarget->DoDie( pAttacker ); // pTarget 죽어라.
pTarget->m_nHitPoint = 0;
}
}
m_nLife ++; // 부딪힐때마다 카운트 올라감
if( m_nLife >= (int)(m_pAddSkillProp->dwSkillLvl / 2) )
DestroyWall();
// 뒤로 밀리기 처리.
#if __VER >= 10 // __AI_0711
if( pTarget->IsRank( RANK_MIDBOSS ) == FALSE )
#endif // __AI_0711
{
FLOAT fPushAngle = pTarget->GetAngle() + 180.0f;
FLOAT fPower = 0.825f;
AngleToVectorXZ( &pTarget->m_pActMover->m_vDeltaE, fPushAngle, fPower );
g_UserMng.AddPushPower( pTarget, pTarget->GetPos(), pTarget->GetAngle(), fPushAngle, fPower );
}
}
//.........这里部分代码省略.........
示例5: GetMover
void CActionMover::PresupposePos2( D3DXVECTOR3* pv, D3DXVECTOR3* pvd, float* pf, float* pfAngleX, float* pfAccPower, u_long uTickCount )
{
CMover* pMover = GetMover();
D3DXVECTOR3 v = pMover->GetPos();
float fAngle = pMover->GetAngle();
D3DXVECTOR3 vDelta = m_vDelta;
if( prj.GetItemProp( pMover->m_dwRideItemIdx ) == NULL )
return;
float fAcc = prj.GetItemProp( pMover->m_dwRideItemIdx )->fFlightSpeed; // 무버가 타고있는 아이템의 인덱스에서 추진력을 꺼내옴.
fAcc *= 0.75f;
float fTheta, fThetaX, d;
DWORD dwMoveState = GetMoveState();
DWORD dwTurnState = GetTurnState();
DWORD dwLookState = GetLookState();
float fX = pMover->GetAngleX();
float fAccPower = m_fAccPower;
float fTurnAngle;
D3DXVECTOR3 vAcc;
for( u_long i = 0; i < uTickCount; i++ )
{
fTheta = D3DXToRadian( fAngle );
switch( dwMoveState )
{
case OBJSTA_STAND:
fAccPower = 0;
break;
case OBJSTA_FMOVE:
fAccPower = fAcc;
break;
}
switch( dwTurnState )
{
case OBJSTA_LTURN:
fTurnAngle = m_fTurnAngle;
if( ( GetStateFlag() & OBJSTAF_ACC ) == 0 )
fTurnAngle *= 2.5f;
fAngle += fTurnAngle;
if( fAngle > 360.0f )
fAngle -= 360.0f;
break;
case OBJSTA_RTURN:
fTurnAngle = m_fTurnAngle;
if( ( GetStateFlag() & OBJSTAF_ACC ) == 0 )
fTurnAngle *= 2.5f;
fAngle -= fTurnAngle;
if( fAngle < 0.0f )
fAngle += 360.0f;
break;
}
switch( dwLookState )
{
case OBJSTA_LOOKUP:
if( fX > -45.0f ) fX -= 1.0f;
break;
case OBJSTA_LOOKDOWN:
if( fX < 45.0f ) fX += 1.0f;
break;
}
fThetaX = D3DXToRadian( fX );
if( GetStateFlag() & OBJSTAF_TURBO )
fAccPower *= 1.5f;
d = cosf( fThetaX ) * fAccPower;
fTheta = D3DXToRadian( fAngle );
vAcc.x = sinf( fTheta ) * d;
vAcc.z = -cosf( fTheta ) * d;
vAcc.y = -sinf( fThetaX ) * fAccPower;
float fLenSq = D3DXVec3LengthSq( &vDelta );
D3DXVECTOR3 vDeltaNorm, vAccNorm;
D3DXVec3Normalize( &vDeltaNorm, &vDelta );
D3DXVec3Normalize( &vAccNorm, &vAcc );
float fDot = D3DXVec3Dot( &vDeltaNorm, &vAccNorm );
if( fAccPower > 0.0f )
{
if( fLenSq > 0.01f )
{
if( fDot < cosf( 70.0f ) )
{
vAcc *= 2.0f;
vDelta *= 0.985f;
}
}
}
fLenSq = D3DXVec3Length( &vDelta );
if( fLenSq < 0.3f )
{
vDelta += vAcc;
}
vDelta *= ( 1.0f - FRIC_AIR );
v += vDelta;
if( v.y > MAX_MOVE_HEIGHT )
v.y = MAX_MOVE_HEIGHT;
//.........这里部分代码省略.........
示例6: ProcessFlyTracking
void CActionMover::ProcessFlyTracking()
{
CMover* pMover = m_pMover;
// 자동 추적 모드. g_pPlayer만 실행된다.
if( pMover->IsActiveMover() && (pMover->m_dwFlag & MVRF_TRACKING) )
{
static float s_fTurnAcc = 0, s_fTurnAccH = 0;
{
CMover *pTarget = prj.GetMover( pMover->m_idTracking ); // 추적할 목표.
if( pTarget )
{
D3DXVECTOR3 vDist = pTarget->GetPos() - pMover->GetPos(); // 나를 원점으로 타겟까지의 벡터.
FLOAT fAngXZ, fAngH;
xGetDegree( &fAngXZ, &fAngH, vDist ); // 타겟과의 각도 구함.
// 남쪽이 0도 기준. 시계방향 -180까지 시계반대방향 +180
// 3도 이하는 무시.
FLOAT fMoverAng = pMover->GetAngle();
if( fMoverAng > 180.0f ) // 계산하기 좋게 좌표계를 +,- 로 바꿈.
fMoverAng -= 360.0f;
FLOAT fSubAng = fAngXZ - fMoverAng;
if( fSubAng > 180.0f )
fSubAng -= 360.0f;
else if( fSubAng < -180.0f )
fSubAng += 360.0f;
#ifdef _DEBUG
#ifdef __XUZHU
extern float _g_fReg[];
_g_fReg[1] = fSubAng;
_g_fReg[2] = fAngXZ;
#endif
#endif
if( fSubAng < -3.0f ) // 오른쪽으로 돌아야 한다.
s_fTurnAcc = -2.5f;
else
if( fSubAng > 3.0f ) // 왼쪽으로 돌아야 한다.
s_fTurnAcc = 2.5f;
else
s_fTurnAcc = 0;
FLOAT fMoverAngX = pMover->GetAngleX();
FLOAT fSubAngH = fAngH - fMoverAngX;
if( fSubAngH > 180.0f )
fSubAngH -= 360.0f;
else if( fSubAngH < -180.0f )
fSubAngH += 360.0f;
if( fSubAngH < -3.0f )
s_fTurnAccH = -1.5f;
else
if( fSubAngH > 3.0f )
s_fTurnAccH = 1.5f;
else
s_fTurnAccH = 0;
pMover->SetAngle( pMover->GetAngle() + s_fTurnAcc );
pMover->SetAngleX( pMover->GetAngleX() + s_fTurnAccH );
if( s_fTurnAcc || s_fTurnAccH ) // 값이 달라지면 전송함.
g_DPlay.PostPlayerAngle( TRUE );
}
}
}
}
示例7: ProcessFlyParticle
void CActionMover::ProcessFlyParticle( float fLenSq )
{
CMover *pMover = m_pMover;
// 운영자 투명모드때는 파티클 안나옴.
if( (pMover->IsMode( TRANSPARENT_MODE ) ) == 0 )
{
ItemProp* pRideProp = prj.GetItemProp( m_pMover->m_dwRideItemIdx ); // 현재 타고있는 탈것의 프로퍼티.
// 비행 파티클 처리.
if( fLenSq > 0.01f )
{
if( (pMover->IsActiveMover() && g_Neuz.m_camera.m_fZoom > 2.0f) || pMover->IsActiveMover() == FALSE ) // 일정속도 이상이 되면 꼬리에 파티클이 나오기 시작.
{
int nType = 0;
if( pRideProp && pRideProp->dwID == II_RID_RID_BOR_RIDINGCLOUD )
nType = 1;
CreateFlyParticle( pMover, pMover->GetAngleX(), nType );
}
}
if( fLenSq > 0.001f )
{
if( (pMover->IsActiveMover() && g_Neuz.m_camera.m_fZoom > 1.0f) || pMover->IsActiveMover() == FALSE )
{
if( pRideProp && pRideProp->dwItemKind3 == IK3_BOARD ) // 보드만 꼬리가 나온다.
{
if( m_pTail )
{
if( pRideProp->dwID == II_RID_RID_BOR_RIDINGCLOUD ) // 근두운일때
{
if( m_pTail->GetType() != 2 ) // 생성되었던 꼬리고 근두운용이 아니면
m_pTail->ChangeTexture( D3DDEVICE, "etc_Tail2.bmp", 2 );
} else
{
if( m_pTail->GetType() != 1 ) // 생성되었던 꼬리고 일반보드용이 아니면
m_pTail->ChangeTexture( D3DDEVICE, "etc_Tail1.bmp", 1 ); // 일반보드용으로 텍스쳐 교체.
}
}
if( m_pTail == NULL ) // 아직 할당 안됐으면 할당하고.
{
if( pRideProp->dwID == II_RID_RID_BOR_RIDINGCLOUD ) // 근두운...
{
m_pTail = (CTailEffectBelt*)g_TailEffectMng.AddEffect( g_Neuz.m_pd3dDevice, "etc_Tail2.bmp", 2 );
}
else
{
m_pTail = (CTailEffectBelt*)g_TailEffectMng.AddEffect( g_Neuz.m_pd3dDevice, "etc_Tail1.bmp", 1 );
}
}
D3DXVECTOR3 vPos1, vPos2;
D3DXVECTOR3 vLocal;
FLOAT fAngXZ = pMover->GetAngle();
FLOAT fAngH = pMover->GetAngleX();
AngleToVectorXZ( &vLocal, fAngXZ, -1.0f );
fAngXZ -= 90.0f;
if( fAngXZ < 0 )
fAngXZ += 360.0f;
AngleToVector( &vPos1, fAngXZ, -fAngH, 0.5f );
vPos1 += pMover->GetPos();
vPos1 += vLocal;
fAngXZ = pMover->GetAngle();
fAngH = pMover->GetAngleX();
AngleToVectorXZ( &vLocal, fAngXZ, -1.0f );
fAngXZ += 90.0f;
if( fAngXZ > 360.0f )
fAngXZ -= 360.0f;
AngleToVector( &vPos2, fAngXZ, -fAngH, 0.5f );
vPos2 += pMover->GetPos();
vPos2 += vLocal;
if( m_pTail )
m_pTail->CreateTail( vPos1, vPos2 );
}
}
}
} // 투명모드가 아닐때
}
示例8: Process
void CBackCamera::Process( LPDIRECT3DDEVICE9 pd3dDevice ,float fFactor )
{
#ifdef __CLIENT
CMover *pMover = CMover::GetActiveMover();
// 여기서 카메라 세팅!!!!!
if( pMover == NULL ) return;
CWorld* pWorld = pMover->GetWorld();
if( pWorld == NULL )
return;
D3DXMATRIX matView, mat;
FLOAT fAngle = 0, fAngleY = 0;
D3DXVECTOR3 vPos = pMover->GetPos();
vPos.y += 0.9f;
#if __VER >= 13 // __HOUSING
if(m_nCamMode == CM_MYROOM)
{
if(m_fZoom <= 0.5f) m_fZoom = 0.5f;
// if(m_fZoom >= 3.0f) m_fZoom = 3.0f;
}
#endif // __HOUSING
CMover* pMoverTarget = (CMover*)g_WorldMng.Get()->GetObjFocus() ;
D3DXVECTOR3 vTarget,vTemp;
if( pMoverTarget && pMover->m_pActMover->IsFly() && (pMover->m_dwFlag & MVRF_TRACKING) )
{ // 날고 있는 경우 타겟이 있다면
// 타겟쪽으로 카메라 방향을 수정한다.
vTemp = vPos - pMoverTarget->GetPos();
if( vTemp.z > 0 )
{
fAngle =- (float)( atan( vTemp.x / vTemp.z ) * 180 / 3.1415926f );
}
else
{
fAngle =- (float)( atan( vTemp.x / vTemp.z ) * 180 / 3.1415926f ) + 180;
}
D3DXVECTOR3 vDistXZ = vTemp;
vDistXZ.y = 0;
float fDistSq = D3DXVec3Length( &vDistXZ ); // XZ평면에서의 길이
fAngleY = atan2( fDistSq, vTemp.y/* * vTemp.y*/ );
fAngleY = D3DXToDegree( fAngleY );
float fReg1 = vTemp.y / 40.0f;
if( fReg1 > 0 )
{
if( fReg1 >= 2.0f ) fReg1 = 2.0f;
} else
if( fReg1 < 0 )
{
if( fReg1 <= -2.0f ) fReg1 = -2.0f;
}
m_fCurRoty = m_fRoty + m_fZoom * fReg1;
if( m_bLock )
fAngle = 0;
}
else
{
fAngle = pMover->GetAngle();
if( m_bLock )
fAngle = 0;
fAngleY = 90.0f;
m_fCurRoty = m_fRoty + m_fZoom * 4;
}
m_vLookAt = vPos;
#ifdef __Y_CAMERA_SLOW_8
if( !g_WndMng.m_pWndWorld->m_bRButtonDown && ( !g_bKeyTable[ VK_LEFT ] && !g_bKeyTable[ VK_RIGHT ] ) )
{
static FLOAT fSpeed = 2.0f;
BOOL bLeft = FALSE;
BOOL bRight = FALSE;
FLOAT fTemp = 0.0f;
fTemp = m_fRotx;
if( (GetAnglePie(fTemp) == 1 && GetAnglePie(m_fCurRotx) == 4) )
bRight = TRUE;
if( (GetAnglePie(fTemp) == 4 && GetAnglePie(m_fCurRotx) == 1) )
bLeft = TRUE;
if( bRight )
{
m_fCurRotx += m_fRotx;
if( m_fCurRotx < fTemp )
{
m_fCurRotx += fSpeed;
}
m_fCurRotx -= m_fRotx;
if( m_fCurRotx >= 0.0f )
{
m_fCurRotx = -360.0f;
//.........这里部分代码省略.........
示例9: if
//.........这里部分代码省略.........
SetState( OBJSTA_ACTION_ALL, OBJSTA_COLLECT );
//pMover->m_dwFlag |= MVRF_NOACTION;
pMover->SetMotion( MTI_COLLECT, ANILOOP_LOOP, MOP_FIXED );
pMover->RemoveInvisible();
break;
case OBJMSG_STUN:
SetState( OBJSTA_ACTION_ALL, OBJSTA_STUN ); // 스턴은 어떤 상태에서도 걸릴 수 있으니 상태는 무조것 세팅하자.
pMover->m_dwFlag |= MVRF_NOACTION; // 액션 금지 상태로 전환.
pMover->m_wStunCnt = (short)nParam1; // 얼마동안이나 스턴상태가 되느냐.
if( GetState() == OBJSTA_STAND )
pMover->SetMotion( MTI_GROGGY, ANILOOP_LOOP, MOP_FIXED ); // 아무것도 안하는 스탠딩 상태면 스턴 모션 내자.
break;
case OBJMSG_FALL:
if( IsActJump() ) return 0;
// 무적이면 여기서 리턴.
if( pMover->m_dwMode & MATCHLESS_MODE )
return 0;
pMover->m_dwFlag |= MVRF_NOACTION; // 액션 금지 상태로 전환.
if( GetState() != OBJSTA_DMG_FLY )
{
SetState( OBJSTA_DMG_ALL, OBJSTA_DMG_FLY );
pMover->SetMotion( MTI_DMGFLY, ANILOOP_LOOP, MOP_FIXED );
}
break;
// 전진해라!
case OBJMSG_TURNMOVE:
if( GetMoveState() == OBJSTA_FMOVE && (int)pMover->GetAngle() == nParam1 ) return 0; // 전진 상태이며 각도가 같으면 메시지 무효
if( pMover->m_dwFlag & MVRF_NOMOVE )
return 0; // 이동금지 상태면 걍 리턴.
#if __VER >= 10 // __LEGEND // 10차 전승시스템 Neuz, World, Trans
if( pMover->GetAdjParam( DST_CHRSTATE ) & CHS_LOOT) return 0;
#endif //__LEGEND // 10차 전승시스템 Neuz, World, Trans
if( GetState() & OBJSTA_DMG_FLY_ALL ) // 날라가는 동작중이면 취소
return 0;
if( IsActAttack() ) return -2;
if( GetDmgState() == OBJSTA_DMG ) // 피격 중 명령이면 피격 상태를 클리어 시킨다.
ResetState( OBJSTA_DMG_ALL );
else if( GetState() & OBJSTA_DMG_ALL ) // 그외 피격동작은 다 취소
return -3;
pMover->SetAngle( (float)nParam1 );
if( pMover->IsFlyingNPC() )
pMover->SetAngleX( (float)nParam2 );
SendActMsg( OBJMSG_STOP_TURN );
SendActMsg( OBJMSG_FORWARD );
break;
case OBJMSG_TURNMOVE2:
if( GetMoveState() == OBJSTA_FMOVE && (int)pMover->GetAngle() == nParam1 ) return 0; // 전진 상태이며 각도가 같으면 메시지 무효
if( pMover->m_dwFlag & MVRF_NOMOVE ) return 0; // 이동금지 상태면 걍 리턴.
#if __VER >= 10 // __LEGEND // 10차 전승시스템 Neuz, World, Trans
if( pMover->GetAdjParam( DST_CHRSTATE ) & CHS_LOOT) return 0;
#endif //__LEGEND // 10차 전승시스템 Neuz, World, Trans
if( IsAction() ) return 0;
if( GetState() & OBJSTA_DMG_FLY_ALL ) // 날라가는 동작중이면 취소
return 0;