本文整理汇总了C++中CMover::GetPos方法的典型用法代码示例。如果您正苦于以下问题:C++ CMover::GetPos方法的具体用法?C++ CMover::GetPos怎么用?C++ CMover::GetPos使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类CMover
的用法示例。
在下文中一共展示了CMover::GetPos方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: DamageToTarget
//
// nDmgCnt : 일반적으론 0 : 지속데미지를 사용할경우에 0이 아닌값이 들어온다.
//
void CSfx::DamageToTarget( int nDmgCnt, float fDmgAngle, float fDmgPower, int nMaxDmgCnt )
{
CMover* pObjSrc = (CMover*)prj.GetCtrl( m_idSrc );
CCtrl* pObjDest = prj.GetCtrl( m_idDest );
if( IsInvalidObj(pObjSrc) ) return; // 지금은 걍 리턴하지만 이렇게 실패한경우는 m_idSfxHit을 Clear해주는작업이 필요하다.
if( IsInvalidObj(pObjDest) ) return;
if( pObjDest->GetType() == OT_MOVER )
{
CMover* pMover = (CMover*) pObjDest;
#ifdef __CLIENT
PLAYSND( pMover->GetProp()->dwSndDmg2, &pMover->GetPos() ); // 마법류 맞을때 타격음.
#endif
#ifdef __CLIENT
// 쏜놈이 플레이어이거나 / 쏜놈은 플레이어가 아닌데 맞은놈이 플레이어일경우 전송
if( pObjSrc->IsActiveMover() || (pObjSrc->IsPlayer() == FALSE && pObjDest->IsActiveObj()) )
{
pMover->SetDmgCnt( 10 ); // 발사체 맞아도 이제 흔들린다,
g_DPlay.SendSfxHit( m_idSfxHit, m_nMagicPower, m_dwSkill, pObjSrc->GetId(), nDmgCnt, fDmgAngle, fDmgPower );
if( nMaxDmgCnt == 1 ) // 한방짜리 데미지만 id를 클리어 함.
m_idSfxHit = 0; // 0으로 해놔야 this가 삭제될때 SendSfxClear를 또 보내지 않는다.
}
#endif // __CLIENT
}
}
示例2: PartyMapInfo
void CPartyMng::PartyMapInfo( )
{
const float PARTY_MAP_AROUND = 32.0f * 32.0f; // m_nVisibilityRange에 영향을 받는다.
if( ++m_nSecCount < PARTY_MAP_SEC )
return;
m_nSecCount = 0;
D3DXVECTOR3 vPosBuf;
float fDist;
for( C2PartyPtr::iterator i = m_2PartyPtr.begin(); i != m_2PartyPtr.end(); ++i )
{
CParty* pParty = (CParty*)i->second;
for( int j = 0 ; j < pParty->GetSizeofMember() ; ++j )
{
CMover* pMover = prj.GetUserByID( pParty->GetPlayerId( j ) );
if( !IsValidObj( pMover ) )
continue;
vPosBuf = pMover->GetPos() - pParty->GetPos( j );
fDist = D3DXVec3LengthSq( &vPosBuf );
if( 0.0f < fDist )
{
pParty->SetPos( j, pMover->GetPos() );
CMover* pSendMover;
for( int k = 0 ; k < pParty->GetSizeofMember() ; ++k )
{
if( k == j )
continue;
pSendMover = prj.GetUserByID( pParty->GetPlayerId( k ) );
if( !IsValidObj( pSendMover ) )
continue;
vPosBuf = pSendMover->GetPos() - pMover->GetPos();
fDist = D3DXVec3LengthSq( &vPosBuf );
if( fDist > PARTY_MAP_AROUND )
((CUser*)pSendMover)->AddPartyMapInfo( j, pMover->GetPos() );
}
}
}
}
}
示例3: GetMover
void CAIMonster2::InitAI()
{
CMover* pMover = GetMover();
MoverProp* pProperty = pMover->GetProp();
ASSERT( pProperty );
if( pProperty->dwAI >= AII_VER2_TYPE0 )
m_dwFsmType = pProperty->dwAI - AII_VER2_TYPE0;
m_vPosBegin = pMover->GetPos();
m_fAttackRange = pMover->GetRadiusXZ();
}
示例4:
//
// 비행중 공격 액션 처리
//
void CActionMover::_ProcessStateAttack2( DWORD dwState, int nParam )
{
CMover* pMover = m_pMover;
CModelObject *pModel = (CModelObject *)pMover->m_pModel;
switch( dwState )
{
case OBJSTA_ATK1:
if( pModel->IsEndFrame() )
ResetState( OBJSTA_ATK_ALL );
if( pModel->m_nPause > 0 )
{
--pModel->m_nPause;
}
else
{
if( pModel->IsAttrHit() )
{
CMover* pHitObj = prj.GetMover( m_objidHit );
if( IsInvalidObj( pHitObj ) || pHitObj->IsDie() ) // 타겟이 거시기하거나 죽었으면 취소
return;
BOOL bSuccess = pHitObj->m_pActMover->SendDamage( AF_GENERIC, pMover->GetId() );
if( bSuccess == FALSE )
return;
#ifdef __CLIENT
ItemProp* pItemProp = pMover->GetActiveHandItemProp();
if( pItemProp )
{
D3DXVECTOR3 v = pMover->GetPos();
PLAYSND( pItemProp->dwSndAttack1, &v );
}
#endif
if( GetMover()->IsPlayer() )
{
pModel->m_nPause = 5; // frame 멈춤
}
else
{
pModel->m_nPause = 0; // 몬스터는 멈추지 않음
pHitObj->m_pModel->m_nPause = 0;
}
}
}
break;
}
}
示例5: 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 );
}
}
}
}
}
示例6: if
//.........这里部分代码省略.........
if( bRight )
{
bRight = FALSE;
bRForward = TRUE;
}
}
}
*/
CWorld* pWorld = g_WorldMng.Get();
CRect rect = GetClientRect();
D3DXVECTOR3 vRayEnd;
CObj* pFocusObj = pWorld->GetObjFocus();
CActionMover *pAct = pMover->m_pActMover;
pAct->m_dwCtrlMsg = 0;
if( m_bLButtonDown )
pAct->m_dwCtrlMsg |= CTRLMSG_LDOWN;
#if __VER >= 12 // __ITEMCREATEMON_S0602
D3DXVECTOR3 vec3Tri[3];
pWorld->ClientPointToVector( vec3Tri, rect, point, &pWorld->m_matProj, &g_Neuz.m_camera.m_matView, &vRayEnd, TRUE );
g_Neuz.m_vCursorPos = vRayEnd;
if( g_Neuz.m_pCreateMonItem )
{
if( bUp || bDown || bLeft || bRight || bSpace || m_bLButtonDown )
{
BOOL bSendCM = TRUE;
if( m_bLButtonDown )
{
D3DXVECTOR3 vDist2 = g_pPlayer->GetPos() - g_Neuz.m_vCursorPos;
float fDist = D3DXVec3Length( &vDist2 ); // 두좌표간의 거리
if( 15.f < fDist )
{
g_WndMng.PutString( prj.GetText( TID_GAME_CREATEMON_F_15 ), NULL, prj.GetTextColor( TID_GAME_CREATEMON_F_15 ) );
bSendCM = FALSE;
}
if( bSendCM )
{
int nAttr = g_pPlayer->GetWorld()->GetHeightAttribute( g_Neuz.m_vCursorPos.x, g_Neuz.m_vCursorPos.z ); // 이동할 위치의 속성 읽음.
if( nAttr == HATTR_NOWALK || nAttr == HATTR_NOMOVE
|| g_pPlayer->IsRegionAttr( RA_SAFETY ) || g_pPlayer->GetWorld()->GetID() == WI_WORLD_GUILDWAR ) // 못 움직이는 곳이거나 안전지역이면 Pass
{
g_WndMng.PutString( prj.GetText( TID_GAME_CREATEMON_F_AREA ), NULL, prj.GetTextColor( TID_GAME_CREATEMON_F_AREA ) );
bSendCM = FALSE;
}
else
if( g_pPlayer->GetWorld()->GetID() != WI_WORLD_MADRIGAL )
{
g_WndMng.PutString( prj.GetText( TID_GAME_CREATEMON_F_AREA ), NULL, prj.GetTextColor( TID_GAME_CREATEMON_F_AREA ) );
bSendCM = FALSE;
}
if( bSendCM )
{
g_DPlay.SendCreateMonster( MAKELONG( ITYPE_ITEM, g_Neuz.m_pCreateMonItem->m_dwObjId ), g_Neuz.m_vCursorPos );
}
}
m_bLButtonDown = FALSE;
}
if( bSendCM )
g_Neuz.m_pCreateMonItem = NULL;
}
示例7: _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 );
}
}
//.........这里部分代码省略.........
示例8: 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 );
//.........这里部分代码省略.........
示例9: Process
void CSfx::Process()
{
#ifdef _DEBUG
if( m_dwIndex == XI_SKILL_MAG_FIRE_HOTAIR01 ) // 디버깅 하려면 이걸 바꿔 쓰세요.
{
int a = 0;
}
#endif
m_nFrame++;
if( m_nSec == 0 ) // 0은 1회 플레이후 종료.
{
if( m_pSfxObj->Process() ) // return true는 애니메이션 끝.
Delete();
}
else
{
// 반복 애니메이션
if( m_pSfxObj->Process() )
m_pSfxObj->m_nCurFrame = 0;
if( m_nSec != -1 ) // 무한반복(-1)이 아니면
{
if( m_nFrame > ( m_nSec * 60 ) ) // 시간 체크를 한다.
Delete();
}
}
#ifdef __CLIENT
if(m_pSfxObj->m_pSfxBase != NULL)
{
for( int j=0; j<m_pSfxObj->m_pSfxBase->m_apParts.GetSize(); j++ )
{
if( m_pSfxObj->m_pSfxBase->Part(j)->m_nType != SFXPARTTYPE_MESH )
continue;
CModelObject* pMesh = NULL;
pMesh = g_SfxMeshMng.Mesh( m_pSfxObj->m_pSfxBase->Part(j)->m_strTex );
if( pMesh )
pMesh->FrameMove();
}
}
#endif //__CLIENT
if( m_idDest != NULL_ID ) // Dest가 지정되어 있을때.
{
CMover* pObjDest = (CMover*)prj.GetCtrl( m_idDest );
if( IsValidObj( pObjDest ) ) // 유효한넘인가?
m_vPosDest = pObjDest->GetPos(); // 당시 좌표를 계속 받아둠. Invalid상태가 되면 마지막 좌표로 세팅된다.
SetPos( m_vPosDest ); // 타겟에 오브젝트 발동.
#ifdef __CLIENT
#if __VER >= 11 // __MA_VER11_06 // 확율스킬 효과수정 world,neuz
if( m_dwIndex == XI_SKILL_PSY_HERO_STONE02 )
{
if( IsValidObj( pObjDest ) ) // 유효한넘인가?
{
DWORD dwTmpID = pObjDest->GetRemoveSfxObj(XI_SKILL_PSY_HERO_STONE02 );
if( dwTmpID && m_nFrame > 0)
{
Delete();
return;
}
}
}
#endif // __MA_VER11_06 // 확율스킬 효과수정 world,neuz
// 091022 mirchang - 프로텍션, 펜바리어 스킬 버프 해제 시 sfx 삭제
if( m_dwIndex == XI_SKILL_MER_SHIELD_PANBARRIER02 )
{
if( IsValidObj( pObjDest ) ) // 유효한넘인가?
{
DWORD dwTmpID = pObjDest->GetRemoveSfxObj( XI_SKILL_MER_SHIELD_PANBARRIER02 );
if( dwTmpID && m_nFrame > 0)
{
Delete();
return;
}
}
}
if( m_dwIndex == XI_SKILL_MER_SHIELD_PROTECTION02 )
{
if( IsValidObj( pObjDest ) ) // 유효한넘인가?
{
DWORD dwTmpID = pObjDest->GetRemoveSfxObj( XI_SKILL_MER_SHIELD_PROTECTION02 );
if( dwTmpID && m_nFrame > 0)
{
Delete();
return;
}
}
}
#endif // __CLIENT
} else
{
// Dest가 지정되어 있지 않을때. Src로...
if( m_idSrc != NULL_ID )
{
CMover* pObjSrc = (CMover*)prj.GetCtrl( m_idSrc );
if( IsValidObj( pObjSrc ) ) // 소스아이디가 지정되어 있으면
SetPos( pObjSrc->GetPos() ); // 소스측에 이펙 발동.
//.........这里部分代码省略.........
示例10: 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 );
}
}
}
} // 투명모드가 아닐때
}
示例11: 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;
//.........这里部分代码省略.........
示例12: if
// 공격 대상을 찾아서 m_idTarget에 세팅한다.
BOOL CAIMonster2::Search()
{
CMover *pMover = GetMover();
CWorld *pWorld = GetWorld();
CModelObject *pModel = (CModelObject *)pMover->GetModel();
FLOAT fRadius = pMover->GetRadiusXZ(); // this의 반지름
FLOAT fRadiusSq = fRadius * fRadius; // 반지름Sq버전.
if( m_idTarget == NULL_ID && // 공격대상이 정해지지 않았고
(m_vTarget.x == 0 && m_vTarget.y == 0 && m_vTarget.z == 0) ) // 공격위치도 정해지지 않았다.
{
// 어떤 쉐리를 공격할까....? 를 선정함.
if( SelectTarget() == FALSE )
return FALSE;
}
D3DXVECTOR3 vTarget;
FLOAT fDistSq = 0; // 공격지점과 this의 거리.
CMover *pTarget = NULL;
if( m_idTarget != NULL_ID ) // 타겟오브젝이 있을때
{
pTarget = prj.GetMover( m_idTarget );
if( IsValidObj(pTarget) )
vTarget = pTarget->GetPos(); // 공격좌표는 타겟무버의 좌표
else
{
m_idTarget = NULL_ID;
return FALSE; // 타겟이 거시기 하면 걍리턴.
}
}
else if( m_vTarget.x && m_vTarget.y && m_vTarget.z ) // 공격 좌표로 설정되어 있을때.
{
vTarget = m_vTarget;
}
else
{
return FALSE; // 타겟이 거시기 하면 걍리턴.
}
D3DXVECTOR3 vDist = vTarget - pMover->GetPos();
fDistSq = D3DXVec3LengthSq( &vDist ); // 목표지점까지는 거리.
m_fAttackRange = fRadius; // 얼마나 근접해야하는가? 디폴트로 반지름 길이.
if( fDistSq < fRadiusSq * 4.0f ) // 근거리면.
{
DWORD dwNum = xRandom( 100 ); // 0 ~ 99까지으 난수.
if( dwNum < 85 )
{
if( xRandom( 2 ) )
m_nAttackType = CAT_NORMAL; // 앞발로 밟기.
else
m_nAttackType = CAT_NORMAL2;
m_fAttackRange = 5.0f; // 딱붙어서 밟아야 한다. ??
}
else
{
m_nAttackType = CAT_QUAKEDOUBLE; // 두손으로 내려치기 - 스턴
}
}
else if( fDistSq < fRadiusSq * 6.0f ) // 반지름의 x배 이하는 쏘기.
{
DWORD dwNum = xRandom( 100 ); // 0 ~ 99까지으 난수.
// 반지름 3배거리 이상이면 원거리.
if( dwNum < 60 )
{
m_nAttackType = CAT_QUAKE_ONE; // 하늘에서 돌 떨어뜨리기
m_fAttackRange = 15.0f; // xx미터 까지 접근하자. ??
}
else
{
m_idTarget = NULL_ID;
return FALSE;
}
}
else
{
m_nAttackType = CAT_NORMAL; // 앞발로 밟기.
m_fAttackRange = fRadius; //10.0f;
}
return TRUE;
}
示例13: 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 );
}
}
}
}
示例14: 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;
//.........这里部分代码省略.........
示例15: OnDamageMsgC
DWORD CActionMover::OnDamageMsgC( DWORD dwMsg, CMover* pAttacker, DWORD dwAtkFlags, int nParam )
{
CMover* pMover = GetMover();
BOOL bValid = IsValidObj( pMover ) && IsValidObj( pAttacker );
if( !bValid || IsState( OBJSTA_DIE_ALL ) )
return 0;
if( IsSit() ) // 앉아있다가 맞으면 앉기해제 한다.
ResetState( OBJSTA_MOVE_ALL );
SendActMsg( OBJMSG_STAND );
// 날때린놈에 대한 정보를 기록함.
if( pMover->IsNPC() && pAttacker->IsPlayer() ) // 맞은놈은 NPC , 어태커가 플레이어 일때만 적용됨
{
pMover->m_idAttacker = pAttacker->GetId(); // 날 때린넘이 어떤놈인가를 기록함.
pMover->m_idTargeter = pAttacker->GetId();
}
pAttacker->m_idLastHitMover = pMover->GetId(); // 어태커가 마지막으로 때렸던넘이 나란걸 기록함.
if( (dwAtkFlags & AF_GENERIC) )
{
ItemProp* pAttackerProp = pAttacker->GetActiveHandItemProp();
D3DXVECTOR3 vLocal;
if( pAttackerProp && pAttackerProp->dwItemKind3 == IK3_YOYO )
{
vLocal = pMover->GetPos();
vLocal.y += 1.0f;
}
else
{
AngleToVectorXZ( &vLocal, pAttacker->GetAngle(), 1.0f );
vLocal += pMover->GetPos(); //gmpbigsun : 피격자 일반 effect 09_12_17
vLocal.y += 1.0f; // 2006/6/20 xuzhu
}
if( pAttackerProp && pAttackerProp->dwSfxObj3 != NULL_ID )
CreateSfx( g_Neuz.m_pd3dDevice, pAttackerProp->dwSfxObj3, vLocal );
if( pAttackerProp && pAttackerProp->dwSfxObj5 != NULL_ID ) //gmpbigsun: 공격자 일반 effect 09_12_17
{
vLocal = pAttacker->GetPos( );
CreateSfx( g_Neuz.m_pd3dDevice, pAttackerProp->dwSfxObj5, vLocal );
}
}
else if ( (dwAtkFlags & AF_MONSTER_SP_CLIENT) )
{
// hitter
ItemProp* pAttackerProp = prj.GetItemProp( nParam >> 16 );
assert( pAttackerProp );
DWORD dwSfxObj = pAttackerProp->dwSfxObj3; // gmpbigsun:특수공격에 이펙트가 있다면 3번사용.
if( dwSfxObj != NULL_ID )
CreateSfx( D3DDEVICE, dwSfxObj, pMover->GetPos() );
// attacker
dwSfxObj = pAttackerProp->dwSfxObj5;
if( NULL_ID != dwSfxObj )
CreateSfx( D3DDEVICE, dwSfxObj, pAttacker->GetPos() );
}