📄 magiceffect.cpp
字号:
posMyEnd.x = posEnd.x;
posMyEnd.y = posEnd.y;
posMyEnd.z = 0;
CPhysics::S3Get3DDir(posMyBegin, posMyEnd, dir3D);
pObj->SetRotate(dir3D.fHorizontal+1.57, dir3D.fVertical);
BOOL bOk = CPhysics::S2DBMGetPos(nCurrentV, 0, fCurrentTime, m_posBegin, posEnd, posCurrent);
m_posBegin = posCurrent;
posCurrent.y -= 50;
pObj->SetWorldPos(posCurrent);
// g_objGameMap.World2Cell(posCurrent.x, posCurrent.y, posCell.x, posCell.y);
// pEffect->SetPos(posCell);
if(bOk)
{
for(int i = 0; i < m_setRoleInfo.size(); i++)
{
MagicEffectRoleInfo* pRoleInfo = m_setRoleInfo[i];
if(!pRoleInfo)
continue;
CPlayer* pPlayer= g_objPlayerSet.GetPlayer(pRoleInfo->idRole);
if(!pPlayer && (pRoleInfo->idRole == g_objHero.GetID()))
pPlayer = &g_objHero;
if(pPlayer)
{
if((infoMagicType.dwActionSort == MAGIC_SORT_ATTACK_SINGLE_HP) ||
(infoMagicType.dwActionSort == MAGIC_SORT_ATTACK_CROSS_HP) ||
(infoMagicType.dwActionSort == MAGIC_SORT_ATTACK_SECTOR_HP) ||
(infoMagicType.dwActionSort == MAGIC_SORT_ATTACK_ROUND_HP))
if(!pPlayer->TestStatus(USERSTATUS_DIE) && !pPlayer->IsMoving() && infoMagicType.dwSenderAction != 0)
{
pPlayer->ResetStepDir();
pPlayer->SetIntoneCmd(_ACTION_BRUISE0, pPlayer->GetDir());
}
if(strcmp(infoMagicType.szTargetEffect, "NULL") != 0)
{
pPlayer->m_objEffect.Add(infoMagicType.szTargetEffect,false,0,pPlayer->GetLook());
}
DWORD dwColor = _COLOR_YELLOW;
if (pPlayer->GetID() == g_objHero.GetID())
dwColor = _COLOR_RED;
if(infoMagicType.dwActionSort == MAGIC_SORT_RECOVER_SINGLE_HP)
dwColor = 0xff33ff33;
if(infoMagicType.dwActionSort == MAGIC_SORT_ATTACK_SINGLE_STATUS ||
infoMagicType.dwActionSort == MAGIC_SORT_RECOVER_SINGLE_STATUS)
{
}
else
{
if (pPlayer->IsGuard())
dwColor = _COLOR_BLUE;
pPlayer->AddZoomNum(pRoleInfo->dwData, dwColor, 100);
}
BOOL bAddLife = false;
if(infoMagicType.dwActionSort == MAGIC_SORT_RECOVER_SINGLE_HP)
bAddLife = true;
if(pPlayer->GetID() != g_objHero.GetID())
{
if(!bAddLife)
pPlayer->SetData(CPlayer::_PLAYER_LIFE, __max(0, (int)pPlayer->GetData(CPlayer::_PLAYER_LIFE)-(int)pRoleInfo->dwData));
else
pPlayer->SetData(CPlayer::_PLAYER_LIFE, __min((int)pPlayer->GetMaxLife(), (int)pPlayer->GetData(CPlayer::_PLAYER_LIFE)+(int)pRoleInfo->dwData));
}
//pPlayer->SetLife(__max(0, (int)pPlayer->GetLife()-(int)pRoleInfo->dwData));
if (strcmp(infoMagicType.szTargetSound, "NULL") != 0)
{
CMyPos posWorld;
pPlayer->GetWorldPos(posWorld);
::DXPlaySound(infoMagicType.szTargetSound, posWorld.x, posWorld.y, nRange);
}
}
}
pObj->Die();
m_pData = NULL;
}
return bOk;
}
//----------------------------------------------------------------------------------------
void CMagicEffect::BeginScreenEffect(DWORD dwScreenRepresent)
{
if(dwScreenRepresent & MAGIC_SHAKENORMAL)
g_objGameMap.BeginShakeEffect();
if(dwScreenRepresent & MAGIC_COLORNORMAL)
g_objGameMap.BeginColorEffect();
if(dwScreenRepresent & MAGIC_SCALENORMAL)
g_objGameMap.BeginScaleEffect();
}
//----------------------------------------------------------------------------------------
BOOL CMagicEffect::ProcessBodyTracePos()
{
MagicTypeInfo infoMagicType;
if(!CMagic::s_objMagicData.GetMagicTypeInfo(m_dwMagicType, m_dwLevel, infoMagicType))
return true;
const int nRange = 3000;
if(!m_bBegin)
{
m_dwBegin = ::TimeGet();
m_bBegin = true;
CPlayer* pPlayer= g_objPlayerSet.GetPlayer(m_idSender);
if(!pPlayer && (m_idSender == g_objHero.GetID()))
pPlayer = &g_objHero;
if(infoMagicType.dwSenderAction != 0)
if(!pPlayer->IsDead())
{
if(infoMagicType.dwSenderAction != 0)
{
pPlayer->ResetStepDir();
CPlayer* pTarget = g_objPlayerSet.GetPlayer(m_idTarget);
if(infoMagicType.idNextMagic != ID_NONE)
pPlayer->SetIntoneCmd(infoMagicType.dwSenderAction, pTarget? pPlayer->GetDir(pTarget) : pPlayer->GetDir(), 0, true);
else
pPlayer->SetIntoneCmd(infoMagicType.dwSenderAction, pTarget? pPlayer->GetDir(pTarget) : pPlayer->GetDir(), 0, false);
}
}
return false;
}
if(!m_bDelayOk)
{
DWORD dwDelay = 200;
if(infoMagicType.dwSenderAction != 0)
dwDelay = 600;
if(::TimeGet() - m_dwBegin < dwDelay)
{
return false;
}
else
{
m_bDelayOk = true;
m_dwBegin = ::TimeGet();
CPlayer* pPlayer= g_objPlayerSet.GetPlayer(m_idSender);
if(!pPlayer && (m_idSender == g_objHero.GetID()))
pPlayer = &g_objHero;
if(pPlayer)
{
if(strcmp(infoMagicType.szSenderEffect, "NULL") != 0)
{
pPlayer->m_objEffect.Add(infoMagicType.szSenderEffect,false,0,pPlayer->GetLook());
}
/*
if(!pPlayer->IsDead())
{
if(infoMagicType.dwSenderAction != 0)
{
pPlayer->ResetStepDir();
CPlayer* pTarget = g_objPlayerSet.GetPlayer(m_idTarget);
if(infoMagicType.idNextMagic != ID_NONE)
pPlayer->SetIntoneCmd(infoMagicType.dwSenderAction, pTarget? pPlayer->GetDir(pTarget) : pPlayer->GetDir(), 0, true);
else
pPlayer->SetIntoneCmd(infoMagicType.dwSenderAction, pTarget? pPlayer->GetDir(pTarget) : pPlayer->GetDir(), 0, false);
}
}*/
if(strcmp(infoMagicType.szSenderSound, "NULL") != 0)
{
CMyPos posWorld;
pPlayer->GetWorldPos(posWorld);
::DXPlaySound(infoMagicType.szSenderSound, posWorld.x, posWorld.y, nRange);
}
}
// 添加3DMapEffect
CMyPos posWorld, posCell;
pPlayer->GetPos(posCell);
g_objGameMap.Cell2World(posCell.x, posCell.y, posWorld.x, posWorld.y);
m_posBegin = posWorld;
CInteractiveLayer* pLayer = g_objGameMap.GetInteractiveLayer();
if (!pLayer)
return true;
C3DMapEffect* pObj = C3DMapEffect::CreateNew(m_posBegin, infoMagicType.szTraceEffect, false);
if(pObj)
{
pLayer->AddMapObj(pObj);
}
m_pData = pObj;
m_bBegin = true;
this->BeginScreenEffect(infoMagicType.dwScreenRepresent);
pPlayer = g_objPlayerSet.GetPlayer(m_idTarget, true);
if(!pPlayer)
{
pObj->Die();
pObj = NULL;
return true;
}
CMyPos posEnd;
CMy3DPos posMyBegin, posMyEnd;
posMyBegin.x = m_posBegin.x;
posMyBegin.y = m_posBegin.y;
posMyBegin.z = 0;
pPlayer->GetPos(posCell);
g_objGameMap.Cell2World(posCell.x, posCell.y, posEnd.x, posEnd.y);
posEnd.y += 10;
posMyEnd.x = posEnd.x;
posMyEnd.y = posEnd.y;
posMyEnd.z = 0;
m_posEnd.x = posEnd.x;
m_posEnd.y = posEnd.y;
CMyPos posCurrent;
BOOL bOk = CPhysics::S2DBMGetPos(0, 0, 0, m_posBegin, posEnd, posCurrent);
CPhysics::S3Get3DDir(posMyBegin, posMyEnd, m_dir3D);
pObj->SetRotate(m_dir3D.fHorizontal+1.57, m_dir3D.fVertical);
posCurrent.y -= 50;
pObj->SetWorldPos(posCurrent);
return false;
}
}
C3DMapEffect* pObj = (C3DMapEffect*)m_pData;
if(!pObj)
return false;
CPlayer* pPlayer = g_objPlayerSet.GetPlayer(m_idTarget, true);
if(!pPlayer)
{
pObj->Die();
pObj = NULL;
return true;
}
// 加速画线到人身上 // 初速度 0 // 加速度 300 象素/秒
CMyPos posEnd, posCurrent;
int nV = 1000;
// int nV = 10;
float fA = (float)0.0;
DWORD dwTime = ::TimeGet() - m_dwBegin;
float fTime = dwTime*1.0/1000;
int nCurrentV = nV + fTime * fA;
float fCurrentTime = (::TimeGet() - m_dwBegin)*1.0/1000;;
CMy3DPos posMyBegin, posMyEnd;
// CMy3DDir dir3D;
posEnd.x = m_posEnd.x;
posEnd.y = m_posEnd.y;
posMyBegin.x = m_posBegin.x;
posMyBegin.y = m_posBegin.y;
posMyBegin.z = 0;
posMyEnd.x = posEnd.x;
posMyEnd.y = posEnd.y;
posMyEnd.z = 0;
//CPhysics::S3Get3DDir(posMyBegin, posMyEnd, m_dir3D);
pObj->SetRotate(m_dir3D.fHorizontal+1.57, m_dir3D.fVertical);
BOOL bOk = CPhysics::S2DBMGetPos(nCurrentV, 0, fCurrentTime, m_posBegin, posEnd, posCurrent);
m_posEnd.x = posEnd.x;
m_posEnd.y = posEnd.y;
//m_posBegin = posCurrent;
posCurrent.y -= 50;
pObj->SetWorldPos(posCurrent);
// g_objGameMap.World2Cell(posCurrent.x, posCurrent.y, posCell.x, posCell.y);
// pEffect->SetPos(posCell);
if(bOk)
{
for(int i = 0; i < m_setRoleInfo.size(); i++)
{
MagicEffectRoleInfo* pRoleInfo = m_setRoleInfo[i];
if(!pRoleInfo)
continue;
CPlayer* pPlayer= g_objPlayerSet.GetPlayer(pRoleInfo->idRole);
if(!pPlayer && (pRoleInfo->idRole == g_objHero.GetID()))
pPlayer = &g_objHero;
if(pPlayer)
{
if((infoMagicType.dwActionSort == MAGIC_SORT_ATTACK_SINGLE_HP) ||
(infoMagicType.dwActionSort == MAGIC_SORT_ATTACK_CROSS_HP) ||
(infoMagicType.dwActionSort == MAGIC_SORT_ATTACK_SECTOR_HP) ||
(infoMagicType.dwActionSort == MAGIC_SORT_ATTACK_ROUND_HP))
if(!pPlayer->TestStatus(USERSTATUS_DIE) && !pPlayer->IsMoving() && infoMagicType.dwSenderAction != 0)
{
pPlayer->ResetStepDir();
pPlayer->SetIntoneCmd(_ACTION_BRUISE0, pPlayer->GetDir());
}
if(strcmp(infoMagicType.szTargetEffect, "NULL") != 0)
{
pPlayer->m_objEffect.Add(infoMagicType.szTargetEffect,false,0,pPlayer->GetLook());
}
DWORD dwColor = _COLOR_YELLOW;
if (pPlayer->GetID() == g_objHero.GetID())
dwColor = _COLOR_RED;
if(infoMagicType.dwActionSort == MAGIC_SORT_RECOVER_SINGLE_HP)
dwColor = 0xff33ff33;
if(infoMagicType.dwActionSort == MAGIC_SORT_ATTACK_SINGLE_STATUS ||
infoMagicType.dwActionSort == MAGIC_SORT_RECOVER_SINGLE_STATUS)
{
}
else
{
if (pPlayer->IsGuard())
dwColor = _COLOR_BLUE;
pPlayer->AddZoomNum(pRoleInfo->dwData, dwColor, 100);
}
BOOL bAddLife = false;
if(infoMagicType.dwActionSort == MAGIC_SORT_RECOVER_SINGLE_HP)
bAddLife = true;
if(pPlayer->GetID() != g_objHero.GetID())
{
if(!bAddLife)
pPlayer->SetData(CPlayer::_PLAYER_LIFE, __max(0, (int)pPlayer->GetData(CPlayer::_PLAYER_LIFE)-(int)pRoleInfo->dwData));
else
pPlayer->SetData(CPlayer::_PLAYER_LIFE, __min((int)pPlayer->GetMaxLife(), (int)pPlayer->GetData(CPlayer::_PLAYER_LIFE)+(int)pRoleInfo->dwData));
}
if (strcmp(infoMagicType.szTargetSound, "NULL") != 0)
{
CMyPos posWorld;
pPlayer->GetWorldPos(posWorld);
::DXPlaySound(infoMagicType.szTargetSound, posWorld.x, posWorld.y, nRange);
}
}
}
pObj->Die();
m_pData = NULL;
}
return bOk;
}
//----------------------------------------------------------------------------------------
void CMagicEffect::GetSoulDirectPos(int nIndex, int nDir, int &x, int &y)
{
int nOptX,nOptY;
nOptY = 1;
nOptX = 1;
switch(nDir)
{
case 0:
case 1:
case 2:
case 3:
nOptX = 1;
nOptY = 1;
break;
case 4:
case 5:
case 6:
case 7:
nOptX = -1;
nOptY = -1;
break;
default:
break;
}
if (nDir == 0 || nDir == 4 )
{
switch(nIndex)
{
case 0:
x = -80; y = 80;
break;
case 1:
x = -60; y = 80;
break;
case 2:
x = -72; y = 60;
break;
case 3:
x = -32; y = 72;
break;
case 4:
x = -72; y = 32;
break;
default:
x = 0; y = 80;
break;
}
}
else if (nDir ==2 || nDir == 6)
{
switch(nIndex)
{
case 0:
x = -80; y = -80;
break;
case 1:
x = -60; y = -80;
break;
case 2:
x = -72; y = -60;
break;
case 3:
x = -32; y = -72;
break;
case 4:
x = -72; y = -32;
break;
default:
x = 0; y = -80;
break;
}
}
else if (nDir == 1 || nDir ==5 )
{
switch(nIndex)
{
case 0:
x = -80; y = 0;
break;
case 1:
x = -60; y = 40;
break;
case 2:
x = -60; y = -40;
break;
case 3:
x = -75; y = 24;
break;
case 4:
x = -75; y = -24;
break;
default:
x = -80; y = 0;
break;
}
}
else if (nDir == 3 ||nDir ==7)
{
switch(nIndex)
{
case 0:
x = 0; y = -80;
break;
case 1:
x = 40; y = -60;
break;
case 2:
x = -40; y = -60;
break;
case 3:
x = 24; y = -75;
break;
case 4:
x = -24; y = -75;
break;
default:
x = 0; y = -80;
break;
}
}
x = nOptX*x;
y = nOptY*y;
}
//--------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -