?? magic.cpp
字號:
{
m_bLightRadius[0]--;
m_bLightRadius[1]--;
}
else if ( m_bLightRadius[0] == 1 )
{
m_bActiveState = _MAGIC_FINISH;
return FALSE;
}
}
}
}
if ( !m_bShowLight ) return TRUE;
if ( m_bActiveState == _MAGIC_ACTIVE || m_bActiveState == _LIGHT_ACTIVE )
{
if ( !m_bFixed )
xLightFog->SetLightRadiusWithRing(m_shScrnX+24,
m_shScrnY+16,
m_bLightRadius[0] + m_bCurrSwing, m_bLightColor[0][0], m_bLightColor[0][1], m_bLightColor[0][2],
m_bLightRadius[1] + m_bCurrSwing, m_bLightColor[1][0], m_bLightColor[1][1], m_bLightColor[1][2]);
else
{
SHORT shPosX, shPosY;
m_pxMap->GetScrnPosFromTilePos(m_shTileX, m_shTileY, shPosX, shPosY);
xLightFog->SetLightRadiusWithRing(shPosX+24,
shPosY+16,
m_bLightRadius[0] + m_bCurrSwing, m_bLightColor[0][0], m_bLightColor[0][1], m_bLightColor[0][2],
m_bLightRadius[1] + m_bCurrSwing, m_bLightColor[1][0], m_bLightColor[1][1], m_bLightColor[1][2]);
}
}
return TRUE;
}
BOOL CMagic::DrawMagic()
{
// 烙矯.
POINT ptArr[16] =
{
{40, 34}, {42, 35}, {49, 33}, {59, 31}, {65, 31}, {62, 33}, {54, 36}, {41, 44}, {47, 48}, {47, 45},
{43, 37}, {41, 38}, {40, 36}, {42, 37}, {43, 35}, {46, 34}
};
POINT ptArr2[16] =
{
{34, 37}, {47, 38}, {62, 48}, {73, 41}, {76, 34}, {72, 43}, {58, 53}, {50, 48}, {34, 49}, {45, 49},
{55, 49}, {56, 43}, {48, 35}, {46, 40}, {46, 47}, {47, 38},
};
if ( g_xMainWnd.Get3DDevice() )
{
if( SUCCEEDED(g_xMainWnd.Get3DDevice()->BeginScene()) )
{
D3DVECTOR vTrans;
D3DMATRIX matTrans;
D3DMATRIX matScale;
D3DMATRIX matRot;
D3DMATRIX matWorld;
D3DMATRIX matTempWorld;
D3DMATRIX matWorldOriginal;
g_xMainWnd.Get3DDevice()->GetTransform(D3DTRANSFORMSTATE_WORLD, &matWorldOriginal);
D3DMATERIAL7 mtrl;
if ( m_bActiveState == _MAGIC_ACTIVE )
{
if ( m_pxMagicImg->NewSetIndex(m_dwCurrFrame) )
{
vTrans.x = (FLOAT) m_shScrnX+(FLOAT)m_pxMagicImg->m_lpstNewCurrWilImageInfo->shWidth /2+m_pxMagicImg->m_lpstNewCurrWilImageInfo->shPX-400;
vTrans.y = (FLOAT)-m_shScrnY-(FLOAT)m_pxMagicImg->m_lpstNewCurrWilImageInfo->shHeight/2-m_pxMagicImg->m_lpstNewCurrWilImageInfo->shPY+300;
vTrans.z = 0;
// 烙矯.
if ( !m_bFixed )
{
if ( m_bMagicNum == _SKILL_FIREBALL2 )
{
g_xGameProc.m_xFlyingTail.SetFlyTailParticle(D3DVECTOR(m_shScrnX+m_pxMagicImg->m_lpstNewCurrWilImageInfo->shPX+ptArr[m_bDir16].x, m_shScrnY+m_pxMagicImg->m_lpstNewCurrWilImageInfo->shPY+ptArr[m_bDir16].y, 0));
g_xGameProc.m_xSmoke.SetSmokeParticle(D3DVECTOR(m_shScrnX+m_pxMagicImg->m_lpstNewCurrWilImageInfo->shPX+ptArr[m_bDir16].x, m_shScrnY+m_pxMagicImg->m_lpstNewCurrWilImageInfo->shPY+ptArr[m_bDir16].y, 0));
}
else if ( m_bMagicNum == _SKILL_FIREBALL )
{
g_xGameProc.m_xFlyingTail.SetFlyTailParticle(D3DVECTOR(m_shScrnX+m_pxMagicImg->m_lpstNewCurrWilImageInfo->shPX+ptArr2[m_bDir16].x, m_shScrnY+m_pxMagicImg->m_lpstNewCurrWilImageInfo->shPY+ptArr2[m_bDir16].y, 0));
g_xGameProc.m_xSmoke.SetSmokeParticle(D3DVECTOR(m_shScrnX+m_pxMagicImg->m_lpstNewCurrWilImageInfo->shPX+ptArr2[m_bDir16].x, m_shScrnY+m_pxMagicImg->m_lpstNewCurrWilImageInfo->shPY+ptArr2[m_bDir16].y, 0));
}
}
D3DUtil_SetTranslateMatrix(matTrans, vTrans);
D3DUtil_SetScaleMatrix(matScale, (FLOAT)m_pxMagicImg->m_lpstNewCurrWilImageInfo->shWidth, (FLOAT)m_pxMagicImg->m_lpstNewCurrWilImageInfo->shHeight, 0.0f);
D3DMath_MatrixMultiply(matWorld, matScale, matTrans);
// D3DMath_MatrixMultiply(matTempWorld, matScale, matTrans);
// D3DUtil_SetRotationMatrix(matRot, D3DVECTOR(1.0f,1.0f,0.0f), g_PI/m_dwCurrFrame);
// D3DMath_MatrixMultiply(matWorld, matRot, matTempWorld);
g_xMainWnd.Get3DDevice()->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorld);
if ( m_lpddsMagicTextr[m_dwCurrFrame-m_dwFstFrame] )
g_xMainWnd.Get3DDevice()->SetTexture(0, m_lpddsMagicTextr[m_dwCurrFrame-m_dwFstFrame]);
D3DUtil_InitMaterial(mtrl,
(FLOAT)m_bMagicColor[0]/255.0f,
(FLOAT)m_bMagicColor[1]/255.0f,
(FLOAT)m_bMagicColor[2]/255.0f);
/* (FLOAT)255/255.0f,
(FLOAT)255/255.0f,
(FLOAT)255/255.0f);
*/ mtrl.diffuse.a = (m_bOpacity+1)/255.0f;
g_xMainWnd.Get3DDevice()->SetMaterial(&mtrl);
SetBlendRenderState(g_xMainWnd.Get3DDevice(), m_bBlendType, mtrl);
g_xMainWnd.Get3DDevice()->DrawPrimitive(D3DPT_TRIANGLESTRIP, D3DFVF_VERTEX, m_avMagic, 4, NULL);
// 盔惑汗蓖.
ZeroMemory(&mtrl, sizeof(mtrl));
mtrl.diffuse.r = mtrl.diffuse.g = mtrl.diffuse.b = 0.1f;
mtrl.ambient.r = mtrl.ambient.g = mtrl.ambient.b = 1.0f;
g_xMainWnd.Get3DDevice()->SetMaterial(&mtrl);
ResetBlendenderState(g_xMainWnd.Get3DDevice());
g_xMainWnd.Get3DDevice()->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorldOriginal);
}
}
g_xMainWnd.Get3DDevice()->EndScene();
return S_OK;
}
}
return E_FAIL;
}
VOID CMagic::DestoryMagic()
{
}
BOOL CMagic::UpdateMagic(INT nLoopTime)
{
m_wCurrDelay += nLoopTime;
m_wMagicLife += nLoopTime;
if ( !DrawLight(&g_xGameProc.m_xLightFog, nLoopTime) )
return FALSE;
if ( m_wCurrDelay > m_wFrmDelay )
{
m_dwCurrFrame++;
m_wCurrDelay = 0;
if ( m_bMagicNum == _SKILL_SINSU && m_dwCurrFrame >= 2362 && m_dwCurrFrame <=2373 )
{
m_wFrmDelay = 30;
}
else if ( m_bMagicNum == _SKILL_SINSU )
{
m_wFrmDelay = 110;
}
if ( m_nDuplicateNum < MAX_DUPLE_COUNT )
{
INT nWaveNum = -1;
const INT nMagicSndTbl[31] =
{
0, 6, 8, 14, 15, 9, 0, 20, 21, 32,
1, 2, 16, 29, 24, 10, 17, 33, 19, 31,
28, 22, 13, 21, 5, 0, 12, 11, 0, 18,
30,
};
if ( m_bMagicNum < 31 )
{
if ( m_bFixed )
nWaveNum = nMagicSndTbl[m_bMagicNum]*10 + 10000 + 2;
else
nWaveNum = nMagicSndTbl[m_bMagicNum]*10 + 10000 + 1;
}
/* if ( nWaveNum > 10010 )
g_xSound.ChgPlayingSet(nWaveNum, m_nDuplicateNum, m_shTileX, m_shTileY, g_xGameProc.m_xMyHero.m_wPosX, g_xGameProc.m_xMyHero.m_wPosY);
*/ }
if ( m_dwCurrFrame >= m_dwEndFrame )
{
if ( m_bRepeat )
{
m_dwCurrFrame = m_dwFstFrame;
}
else
{
m_dwCurrFrame = m_dwEndFrame-1;
m_bActiveState = _LIGHT_ACTIVE;
return FALSE;
}
}
}
BOOL bCrash = FALSE;
SHORT shScrnGapX, shScrnGapY;
if ( !m_bFixed )
{
if ( m_pxTarget )
{
// 鷗百狼 諒釬甫 犁汲瀝茄促.
m_shTargetTileX = m_pxTarget->m_wPosX;
m_shTargetTileY = m_pxTarget->m_wPosY;
m_shTargetScrnX = m_pxTarget->m_shScrnPosX;
m_shTargetScrnY = m_pxTarget->m_shScrnPosY;
m_shTileX = m_shFireTileX;
m_shTileY = m_shFireTileY;
// m_shScrnX = m_fFloatScrnX = m_shFireScrnX;
// m_shScrnY = m_fFloatScrnY = m_shFireScrnY;
// 芭府犁汲瀝.
if ( m_shScrnX != m_shTargetScrnX ) shScrnGapX = abs(m_shTargetScrnX-m_shScrnX);
else shScrnGapX = 1;
if ( m_shScrnY != m_shTargetScrnY ) shScrnGapY = abs(m_shTargetScrnY-m_shScrnY);
else shScrnGapY = 1;
if ( shScrnGapX > shScrnGapY )
{
m_nDistanceX = (m_shTargetScrnX-m_shScrnX) * (500/shScrnGapX);
m_nDistanceY = (m_shTargetScrnY-m_shScrnY) * (500/shScrnGapX);
}
else
{
m_nDistanceX = (m_shTargetScrnX-m_shScrnX) * (500/shScrnGapY);
m_nDistanceY = (m_shTargetScrnY-m_shScrnY) * (500/shScrnGapY);
}
m_fFloatScrnX += (FLOAT)(((FLOAT)m_nDistanceX/700) * nLoopTime);
m_fFloatScrnY += (FLOAT)(((FLOAT)m_nDistanceY/700) * nLoopTime);
m_shScrnX = m_fFloatScrnX;
m_shScrnY = m_fFloatScrnY;
// 泅犁 膠農(nóng)赴諒釬甫 鷗老諒釬肺 函券竅咯 付過烹苞咯何甫 搬瀝茄促.
// if ( 付過撈 烹苞且薦 絕欄擱 )
INT nabsX, nabsY;
nabsX = abs(m_shTargetScrnX-m_shScrnX);
nabsY = abs(m_shTargetScrnY-m_shScrnY);
if ( (nabsX <= 48 && nabsY <= 32) || (nabsX >= m_nPrevDistanceX && nabsY >= m_nPrevDistanceY) )
{
bCrash = TRUE;
}
else
{
m_nPrevDistanceX = nabsX;
m_nPrevDistanceY = nabsY;
}
}
// Target Actor啊 絕促擱.
else
{
FLOAT fDisX = (FLOAT)((FLOAT)m_nDistanceX/900);
FLOAT fDisY = (FLOAT)((FLOAT)m_nDistanceY/900);
m_fFloatScrnX += ((fDisX) * (FLOAT)nLoopTime);
m_fFloatScrnY += ((fDisY) * (FLOAT)nLoopTime);
m_shScrnX = (SHORT)m_fFloatScrnX;
m_shScrnY = (SHORT)m_fFloatScrnY;
m_pxMap->GetTilePosFromScrnPos(m_shScrnX, m_shScrnY, m_shTileX, m_shTileY);
if ( m_bMagicNum == _SKILL_FIRECHARM || m_bMagicNum == _SKILL_FIREBALL2 || m_bMagicNum == _SKILL_FIREBALL || m_bMagicNum == _SKILL_SHOOTLIGHTEN )
{
if ( m_wMagicLife >= 3000 )
{
bCrash = TRUE;
m_bActiveState = _MAGIC_FINISH;
}
}
else
{
if ( (abs(m_shTargetScrnX-m_shScrnX) <= 32 && abs(m_shTargetScrnY-m_shScrnY) <= 20) )
{
bCrash = TRUE;
}
}
}
}
// 框流撈瘤 臼綽 瓤苞扼擱.
else
{
if ( m_pxTarget )
{
m_shTileX = m_shTargetTileX = m_pxTarget->m_wPosX;
m_shTileY = m_shTargetTileY = m_pxTarget->m_wPosY;
m_shScrnX = m_shTargetScrnX = m_pxTarget->m_shScrnPosX;
m_shScrnY = m_shTargetScrnY = m_pxTarget->m_shScrnPosY;
}
else
{
m_shTileX = m_shTargetTileX;
m_shTileY = m_shTargetTileY;
m_pxMap->GetScrnPosFromTilePos(m_shTargetTileX, m_shTargetTileY, m_shTargetScrnX, m_shTargetScrnY);
m_shScrnX = m_shTargetScrnX;
m_shScrnY = m_shTargetScrnY;
}
}
if ( bCrash )
{
m_bFixed = TRUE;
m_bRepeat= FALSE;
bCrash = TRUE;
// 氣慣橇飯烙欄肺傈券茄促.
LPEFFECTSPRINFO pstMagicSpr = g_xSpriteInfo.GetExplosionInfo(m_bMagicNum);
if ( !pstMagicSpr )
{
// 氣慣橇飯烙撈 絕促擱.
m_bActiveState = _MAGIC_FINISH;
return FALSE;
}
//------------------------------------------------------------------------------------------------------------
// 橇飯烙瀝焊掘扁.
//------------------------------------------------------------------------------------------------------------
m_dwFstFrame = pstMagicSpr->dwFstFrm;
m_dwEndFrame = pstMagicSpr->dwEndFrm;
m_dwCurrFrame = m_dwFstFrame;
m_wFrmDelay = pstMagicSpr->wDelay;
m_bLightRadius[0] = pstMagicSpr->bLightRadius[0];
m_bLightRadius[1] = pstMagicSpr->bLightRadius[1];
m_bLightColor[0][0] = pstMagicSpr->bLightColor[0][0];
m_bLightColor[0][1] = pstMagicSpr->bLightColor[0][1];
m_bLightColor[0][2] = pstMagicSpr->bLightColor[0][2];
m_bLightColor[1][0] = pstMagicSpr->bLightColor[1][0];
m_bLightColor[1][1] = pstMagicSpr->bLightColor[1][1];
m_bLightColor[1][2] = pstMagicSpr->bLightColor[1][2];
m_bBlendType = pstMagicSpr->bBlendType;
m_bOpacity = pstMagicSpr->bOpa;
m_bSwingCnt = pstMagicSpr->bSwingCnt;
//------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------
// 撈固瘤肺爹.
//------------------------------------------------------------------------------------------------------------
WORD wFileType;
WORD wImgIdx = pstMagicSpr->wImgIdx;
m_pxMagicImg = &g_xGameProc.m_xImage.m_xImageList[wImgIdx];
for ( INT nCnt = pstMagicSpr->dwFstFrm; nCnt < pstMagicSpr->dwEndFrm; nCnt++ )
{
if ( wImgIdx == _IMAGE_MAGIC )
{
wFileType = _TEXTR_FILE_MAGIC;
}
else if ( wImgIdx == _IMAGE_MONMAGIC )
{
wFileType = _TEXTR_FILE_MONMAGIC;
}
g_xGameProc.m_xImage.AddTextr(wFileType, wImgIdx, nCnt);
m_lpddsMagicTextr[nCnt-m_dwFstFrame] = g_xGameProc.m_xImage.GetTextrImg(wFileType, wImgIdx, nCnt);
}
D3DVECTOR vNorm(0, 0, -1);
m_avMagic[0] = D3DVERTEX(D3DVECTOR(-0.5f, 0.5f, 0), vNorm, 0, 0);
m_avMagic[1] = D3DVERTEX(D3DVECTOR(-0.5f,-0.5f, 0), vNorm, 0, 1);
m_avMagic[2] = D3DVERTEX(D3DVECTOR( 0.5f, 0.5f, 0), vNorm, 1, 0);
m_avMagic[3] = D3DVERTEX(D3DVECTOR( 0.5f,-0.5f, 0), vNorm, 1, 1);
//------------------------------------------------------------------------------------------------------------
const INT nMagicSndTbl[31] =
{
0, 6, 8, 14, 15, 9, 0, 20, 21, 32,
1, 2, 16, 29, 24, 10, 17, 33, 19, 31,
28, 22, 13, 21, 5, 0, 12, 11, 0, 18,
30,
};
INT nWaveNum = -1;
static DWORD dwLastTick = 0;
if ( timeGetTime() - dwLastTick > 100 )
{
if ( m_bMagicNum < 31 )
{
if ( m_bFixed )
nWaveNum = nMagicSndTbl[m_bMagicNum]*10 + 10000 + 2;
else
nWaveNum = nMagicSndTbl[m_bMagicNum]*10 + 10000 + 1;
}
/* if ( nWaveNum > 10000 )
g_xSound.PlayActorWav(m_shTileX, m_shTileY, g_xGameProc.m_xMyHero.m_wPosX, g_xGameProc.m_xMyHero.m_wPosY, nWaveNum);
*/ }
dwLastTick = timeGetTime();
}
return TRUE;
}
BOOL CElecMagic::CreateMagic(BYTE bMagicNum, SHORT shFireTileX, SHORT shFireTileY, SHORT shTargetTileX, SHORT shTargetTileY, CActor* pxOwner, INT nTarget)
{
if ( CMagic::CreateMagic(bMagicNum, shFireTileX, shFireTileY, shTargetTileX, shTargetTileY, pxOwner, nTarget) )
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -