📄 game3deffectex.cpp
字号:
// get effect
C3DEffect* pEffect = g_objGameDataSet.Get3DEffect(pIDInfo->idEffect);
if(!pEffect)
return;
// get txeture of effect
C3DTexture* pTexture = g_objGameDataSet.Get3DTexture(pIDInfo->idTexture);
if(!pTexture)
return;
// set the texture
pEffect->SetTexture(pTexture);
pEffect->SetFrames(pInfo->dwCurrentFrameIndex);
// restore shape info
pEffect->RestoreShapeInfo(pIDInfo->pShapeInfoBuf);
// setpos
if(pInfo->bSelfRotate)
pEffect->Rotate(0, 0, pInfo->fDir);
else
pEffect->Rotate(m_fX, m_fY, m_fZ);
pEffect->Move(0, pInfo->nOffsetZ, m_Height*1.4);
if(m_bOblique)
pEffect->Rotate ( D3DXToRadian ( -30.0f ), 0, 0 );
pEffect->Move(posWorld.x + pInfo->nOffsetX, 0, posWorld.y + pInfo->nOffsetY);
pEffect->Draw(false, pIDInfo->nASB, pIDInfo->nADB);
pEffect->BackupShapeInfo(pIDInfo->pShapeInfoBuf);
}
}
//-------------------------------------------------------------------
BOOL CGame3DEffectEx::Process(Game3DEffectExInfo* pInfo)
{
int nAmount = pInfo->nInfoAmount;
if(nAmount <= 0)
return true;
if(!pInfo)
return true;
int nMaxFrameAmount = 0;
{
Game3DEffectIdInfo* pIdInfo = pInfo->pIDInfo;
if(pIdInfo)
{
C3DEffect* pEffect = g_objGameDataSet.Get3DEffect(pIdInfo->idEffect);
if(pEffect)
nMaxFrameAmount = pEffect->GetFrames();
}
}
/*
for(int i = 0; i < pInfo->nInfoAmount; i++)
{
Game3DEffectIdInfo* pIdInfo = pInfo->pIDInfo + i;
if(pIdInfo)
{
C3DEffect* pEffect = g_objGameDataSet.Get3DEffect(pIdInfo->idEffect);
if(pEffect && pEffect->GetFrames() > nMaxFrameAmount)
nMaxFrameAmount = pEffect->GetFrames();
}
}
*/
// 看看死了没
DWORD dwTimePass = ::TimeGet() - pInfo->dwTimeBegin;
if(dwTimePass < pInfo->dwTimeDelay)
{
pInfo->bShow = false;
return false;
}
dwTimePass -= pInfo->dwTimeDelay;
DWORD dwAllTime = pInfo->dwLoopTime * (pInfo->dwFrameInterval*nMaxFrameAmount+pInfo->dwLoopInterval)-pInfo->dwLoopInterval;
if(dwAllTime <= dwTimePass)
{
return true;
}
// 取祯数
int nData = (pInfo->dwFrameInterval*nMaxFrameAmount+pInfo->dwLoopInterval);
if(nData == 0)
nData = 1;
int nTime = (int)(dwTimePass/nData);
DWORD dwTimePassThisLoop = dwTimePass - (pInfo->dwFrameInterval*nMaxFrameAmount+pInfo->dwLoopInterval)*nTime;
int nFrameIndex = dwTimePassThisLoop/pInfo->dwFrameInterval;
if(nFrameIndex >= nMaxFrameAmount)
{
pInfo->bShow = false;
}
else
{
pInfo->bShow = true;
pInfo->dwCurrentFrameIndex = nFrameIndex;
}
return false;
}
//-------------------------------------------------------------------
BOOL CGame3DEffectEx::Process()
{
int nAmount = m_setInfo.size();
if(nAmount <= 0)
return true;
for(int i = nAmount-1; i >= 0; i --)
{
Game3DEffectExInfo* pInfo = m_setInfo[i];
if(pInfo)
{
if(this->Process(pInfo))
{
// 结束
this->Delete(pInfo->szIndex);
}
}
}
return false;
}
//-------------------------------------------------------------------
void CGame3DEffectEx::Clear()
{
int nAmount = m_setInfo.size();
for(int i = nAmount-1; i >= 0; i--)
{
Game3DEffectExInfo* pInfo = m_setInfo[i];
if(pInfo->pIDInfo)
{
int nMyAmount = pInfo->nInfoAmount;
for(int i = 0; i < nMyAmount; i ++)
{
Game3DEffectIdInfo* pMyInfo = pInfo->pIDInfo + i;
if(pMyInfo)
C3DEffect::DestroyShapeInfo(pMyInfo->pShapeInfoBuf, pMyInfo->nShapes);
}
delete[] pInfo->pIDInfo;
pInfo->pIDInfo = NULL;
}
SAFE_DELETE(pInfo);
}
m_setInfo.clear();
}
//-------------------------------------------------------------------
void CGame3DEffectEx::DeleteByVMesh(char* pszVMesh)
{
if(!pszVMesh)
return;
int nAmount = m_setInfo.size();
for(int i= 0; i< nAmount; i++)
{
Game3DEffectExInfo* pInfo = m_setInfo[i];
if(pInfo && NULL != strstr(pInfo->szIndex, pszVMesh))
{
// delete
m_setInfo.erase(m_setInfo.begin()+i);
if (pInfo->pIDInfo)
{
int nMyAmount = pInfo->nInfoAmount;
for(int i = 0; i < nMyAmount; i ++)
{
Game3DEffectIdInfo* pMyInfo = pInfo->pIDInfo + i;
if(pMyInfo)
C3DEffect::DestroyShapeInfo(pMyInfo->pShapeInfoBuf, pMyInfo->nShapes);
}
delete[] pInfo->pIDInfo;
pInfo->pIDInfo = NULL;
}
SAFE_DELETE(pInfo);
return;
}
}
}
//-------------------------------------------------------------------
void CGame3DEffectEx::Delete(char* pszIndex)
{
if(!pszIndex)
return;
int nAmount = m_setInfo.size();
for(int i= 0; i< nAmount; i++)
{
Game3DEffectExInfo* pInfo = m_setInfo[i];
if(pInfo && 0 == strcmp(pszIndex, pInfo->szIndex))
{
// delete
m_setInfo.erase(m_setInfo.begin()+i);
if (pInfo->pIDInfo)
{
int nMyAmount = pInfo->nInfoAmount;
for(int i = 0; i < nMyAmount; i ++)
{
Game3DEffectIdInfo* pMyInfo = pInfo->pIDInfo + i;
if(pMyInfo)
C3DEffect::DestroyShapeInfo(pMyInfo->pShapeInfoBuf, pMyInfo->nShapes);
}
delete[] pInfo->pIDInfo;
pInfo->pIDInfo = NULL;
}
SAFE_DELETE(pInfo);
return;
}
}
}
//-------------------------------------------------------------------
void CGame3DEffectEx::Add(Game3DEffectExInfo* pInfo)
{
if(!pInfo)
return;
m_setInfo.push_back(pInfo);
}
//-------------------------------------------------------------------
void CGame3DEffectEx::Add(char* pszIndex, BOOL bSelfRotate, int nDir)
{
if(!pszIndex)
return;
if(strcmp(pszIndex, "none") == 0)
return;
if(strcmp(pszIndex, "null") == 0)
return;
const CMy3DEffectInfo* pEffectInfo = g_obj3DRoleData.GetMy3DEffectInfo(pszIndex);
if (!pEffectInfo)
return;
Game3DEffectExInfo* pInfo = new Game3DEffectExInfo;
MYASSERT (pInfo);
memset(pInfo, 0L, sizeof(Game3DEffectExInfo));
if(!bSelfRotate)
{
pInfo->bSelfRotate = false;
}
else
{
pInfo->bSelfRotate = true;
pInfo->fDir = (float)(3.14159*9/4 - 3.14159*nDir/4);
}
pInfo->nInfoAmount = pEffectInfo->nAmount;
pInfo->pIDInfo = new Game3DEffectIdInfo[pInfo->nInfoAmount];
MYASSERT(pInfo->pIDInfo);
for(int i = 0; i < pInfo->nInfoAmount; i++)
{
Game3DEffectIdInfo* pIDInfo = pInfo->pIDInfo+i;
memset(pIDInfo, 0L, sizeof(Game3DEffectIdInfo));
pIDInfo->idEffect = pEffectInfo->idEffect[i];
pIDInfo->idTexture = pEffectInfo->idTexture[i];
pIDInfo->nADB = pEffectInfo->nADB[i];
pIDInfo->nASB = pEffectInfo->nASB[i];
C3DEffect* pEffect = g_objGameDataSet.Get3DEffect(pIDInfo->idEffect);
MYASSERT (pEffect);
pEffect->ResetShape();
pIDInfo->pShapeInfoBuf = pEffect->CreateShapeInfo();
pIDInfo->nShapes = pEffect->GetShapeAmount();
pEffect->BackupShapeInfo(pIDInfo->pShapeInfoBuf);
}
pInfo->dwTimeDelay = pEffectInfo->nDelay;
pInfo->dwLoopTime = pEffectInfo->nLoopTime;
pInfo->dwFrameInterval = pEffectInfo->nFrameInterval;
pInfo->dwLoopInterval = pEffectInfo->nLoopInterval;
pInfo->nOffsetX = pEffectInfo->nOffsetX;
pInfo->nOffsetY = pEffectInfo->nOffsetY;
pInfo->nOffsetZ = pEffectInfo->nOffsetZ;
pInfo->bShow = true;
strcpy(pInfo->szIndex, pszIndex);
pInfo->dwTimeBegin = ::TimeGet();
this->Add(pInfo);
}
//-----------------------------------------------------------------
void CGame3DEffectEx::EverPlay()
{
int nAmount = m_setInfo.size();
for(int i = 0; i < nAmount; i++)
{
Game3DEffectExInfo* pInfo = m_setInfo[i];
if(pInfo)
{
pInfo->dwLoopTime = 99999999;
}
}
}
//-----------------------------------------------------------------
BOOL CGame3DEffectEx::TestEffect(char* pszIndex)
{
if(!pszIndex)
return false;
int nAmount = m_setInfo.size();
for(int i = 0; i < nAmount; i++)
{
Game3DEffectExInfo* pInfo = m_setInfo[i];
if(pInfo)
{
if(strcmp(pInfo->szIndex, pszIndex) == 0)
return true;
}
}
return false;
}
//-----------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -