📄 lightfog.cpp
字号:
#include "StdAfx.h"
CLightFog::CLightFog()
{
Init(RGB(220, 220, 220));
}
CLightFog::~CLightFog()
{
}
VOID CLightFog::Init(DWORD dwLightColor)
{
m_dwLightColor = dwLightColor;
for ( INT nCntY = 0; nCntY < (NUM_CNTY_LIGHTTILE+1); nCntY++ )
{
for ( INT nCntX = 0; nCntX < (NUM_CNTX_LIGHTTILE+1); nCntX++ )
{
m_avLight[nCntY][nCntX] = D3DLVERTEX(D3DVECTOR((FLOAT)(TILE_START_XPOS+(nCntX*TILE_WIDTH)), (FLOAT)(-TILE_START_YPOS-(nCntY*TILE_HEIGHT)), 0),
m_dwLightColor, RGB(0, 0, 0), 0, 0);
}
}
memcpy(m_avSaveLight, m_avLight, sizeof(D3DLVERTEX)*(NUM_CNTY_LIGHTTILE+1)*(NUM_CNTX_LIGHTTILE+1));
// 鸥老弃府帮狼 牢郸胶 积己.
WORD* pwIndex = m_pwLightIndices;
for ( nCntY = 0; nCntY < NUM_CNTY_LIGHTTILE; nCntY++ )
{
for ( INT nCntX = 0; nCntX < NUM_CNTX_LIGHTTILE; nCntX++ )
{
*pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*nCntY);
*pwIndex++ = nCntX+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));
*pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));
*pwIndex++ = nCntX+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));
*pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*nCntY);
*pwIndex++ = (nCntX)+((NUM_CNTX_LIGHTTILE+1)*nCntY);
}
}
}
VOID CLightFog::ChangeLightColor(DWORD dwColor)
{
if ( m_dwLightColor != dwColor )
{
for ( INT nCntY = 0; nCntY < NUM_CNTY_LIGHTTILE+1; nCntY++ )
{
for ( INT nCntX = 0; nCntX < NUM_CNTX_LIGHTTILE+1; nCntX++ )
{
m_avLight[nCntY][nCntX].color = dwColor;
}
}
m_dwLightColor = dwColor;
memcpy(m_avSaveLight, m_avLight, sizeof(D3DLVERTEX)*(NUM_CNTY_LIGHTTILE+1)*(NUM_CNTX_LIGHTTILE+1));
}
}
VOID CLightFog::ClearSavedLightColor()
{
memcpy(m_avLight, m_avSaveLight, sizeof(D3DLVERTEX)*(NUM_CNTY_LIGHTTILE+1)*(NUM_CNTX_LIGHTTILE+1));
}
BOOL CLightFog::GetScreenPosToLightTile(INT nX, INT nY, INT* nTileX, INT* nTileY)
{
*nTileX = (nX - TILE_START_XPOS) / TILE_WIDTH;
*nTileY = (nY - TILE_START_YPOS) / TILE_HEIGHT;
return TRUE;
}
BOOL CLightFog::SetLightRadiusWithRing(INT XLightPos, INT YLightPos,
INT nSmallRadius,
INT nSmallRed, INT nSmallGreen, INT nSmallBlue,
INT nLargeRadius,
INT nLargeRed, INT nLargeGreen, INT nLargeBlue)
{
INT nX, nY;
GetScreenPosToLightTile(XLightPos, YLightPos, &nX, &nY);
INT nStartTileX = nX - nLargeRadius;
INT nStartTileY = nY - nLargeRadius;
INT nEndTileX = nX + nLargeRadius + 1;
INT nEndTileY = nY + nLargeRadius + 1;
// y甫 绵栏肺 秦辑 俩 绢滴款 何盒阑 备茄促.(x焊促 y啊 歹 利栏骨肺)
nLargeRadius = (nLargeRadius*TILE_HEIGHT);
nSmallRadius = (nSmallRadius*TILE_HEIGHT);
DOUBLE rLengthCnt = 0;
INT nSelectedRedValue = 0;
INT nSelectedGreenValue = 0;
INT nSelectedBlueValue = 0;
if ( nStartTileX < 0 ) nStartTileX = 0;
if ( nStartTileY < 0 ) nStartTileY = 0;
if ( nEndTileX > NUM_CNTX_LIGHTTILE+1 ) nEndTileX = NUM_CNTX_LIGHTTILE+1;
if ( nEndTileY > NUM_CNTY_LIGHTTILE+1 ) nEndTileY = NUM_CNTY_LIGHTTILE+1;
for ( INT nCntY = nStartTileY; nCntY < nEndTileY; nCntY++ )
{
for ( INT nCntX = nStartTileX; nCntX < nEndTileX; nCntX++ )
{
rLengthCnt = sqrt((XLightPos-(nCntX*TILE_WIDTH+TILE_START_XPOS))*(XLightPos-(nCntX*TILE_WIDTH+TILE_START_XPOS)) +
(YLightPos-(nCntY*TILE_HEIGHT+TILE_START_YPOS))*(YLightPos-(nCntY*TILE_HEIGHT+TILE_START_YPOS)));
if ( nCntX < NUM_CNTX_LIGHTTILE && nCntY < NUM_CNTY_LIGHTTILE )
{
// 器牢飘痢阑 器窃窍瘤 臼绰 谅窍. 器牢飘痢阑 器窃窍瘤 臼绰 快惑.
if ( (nCntX > nX && nCntY < nY) || (nCntX < nX && nCntY > nY) )
{
WORD* pwIndex = ((WORD*)m_pwLightIndices+(nCntX+nCntY*(NUM_CNTX_LIGHTTILE))*6);
*pwIndex++ = (nCntX)+((NUM_CNTX_LIGHTTILE+1)*nCntY);
*pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*nCntY);
*pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));
*pwIndex++ = (nCntX)+((NUM_CNTX_LIGHTTILE+1)*nCntY);
*pwIndex++ = nCntX+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));
*pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));
}
else
{
WORD* pwIndex = ((WORD*)m_pwLightIndices+(nCntX+nCntY*(NUM_CNTX_LIGHTTILE))*6);
*pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*nCntY);
*pwIndex++ = nCntX+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));
*pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));
*pwIndex++ = nCntX+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));
*pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*nCntY);
*pwIndex++ = (nCntX)+((NUM_CNTX_LIGHTTILE+1)*nCntY);
}
}
if ( rLengthCnt < nSmallRadius )
{
nSelectedRedValue = nSmallRed - INT((nSmallRed*rLengthCnt)/(nLargeRadius));
nSelectedGreenValue = nSmallGreen - INT((nSmallGreen*rLengthCnt)/(nLargeRadius));
nSelectedBlueValue = nSmallBlue - INT((nSmallBlue*rLengthCnt)/(nLargeRadius));
}
else if ( rLengthCnt >= nSmallRadius && rLengthCnt <= nLargeRadius )
{
nSelectedRedValue = nLargeRed - INT((nLargeRed*rLengthCnt)/(nLargeRadius));
nSelectedGreenValue = nLargeGreen - INT((nLargeGreen*rLengthCnt)/(nLargeRadius));
nSelectedBlueValue = nLargeBlue - INT((nLargeBlue*rLengthCnt)/(nLargeRadius));
}
else
{
nSelectedRedValue = nSelectedGreenValue = nSelectedBlueValue = 0;
}
if ( nSelectedRedValue < 0 ) nSelectedRedValue = 0;
if ( nSelectedGreenValue < 0 ) nSelectedGreenValue = 0;
if ( nSelectedBlueValue < 0 ) nSelectedBlueValue = 0;
if ( m_avLight[nCntY][nCntX].color == 0 )
m_avLight[nCntY][nCntX].color = RGB(nSelectedRedValue, nSelectedGreenValue, nSelectedBlueValue);
else
{
nSelectedRedValue += (INT)RGB_GETBLUE(m_avLight[nCntY][nCntX].color);
nSelectedGreenValue += (INT)RGB_GETGREEN(m_avLight[nCntY][nCntX].color);
nSelectedBlueValue += (INT)RGB_GETRED(m_avLight[nCntY][nCntX].color);
if ( nSelectedRedValue > 255 ) nSelectedRedValue = 255;
if ( nSelectedGreenValue > 255 ) nSelectedGreenValue = 255;
if ( nSelectedBlueValue > 255 ) nSelectedBlueValue = 255;
m_avLight[nCntY][nCntX].color = RGB(nSelectedRedValue, nSelectedGreenValue, nSelectedBlueValue);
}
}
}
return TRUE;
}
BOOL CLightFog::SetLightRadiusWithCircle(INT XLightPos, INT YLightPos, INT nRadius,
INT nRedValue, INT nGreenValue, INT nBlueValue,
FLOAT rDrakRate)
{
INT nX, nY;
GetScreenPosToLightTile(XLightPos, YLightPos, &nX, &nY);
INT nStartTileX = nX - nRadius;
INT nStartTileY = nY - nRadius;
INT nEndTileX = nX + nRadius + 1;
INT nEndTileY = nY + nRadius + 1;
// y甫 绵栏肺 秦辑 俩 绢滴款 何盒阑 备茄促.(x焊促 y啊 歹 利栏骨肺)
nRadius = (nRadius*TILE_HEIGHT);
DOUBLE rLengthCnt = 0;
INT nSelectedRedValue = 0;
INT nSelectedGreenValue = 0;
INT nSelectedBlueValue = 0;
if ( nStartTileX < 0 ) nStartTileX = 0;
if ( nStartTileY < 0 ) nStartTileY = 0;
if ( nEndTileX > NUM_CNTX_LIGHTTILE+1 ) nEndTileX = NUM_CNTX_LIGHTTILE+1;
if ( nEndTileY > NUM_CNTY_LIGHTTILE+1 ) nEndTileY = NUM_CNTY_LIGHTTILE+1;
for ( INT nCntY = nStartTileY; nCntY < nEndTileY; nCntY++ )
{
for ( INT nCntX = nStartTileX; nCntX < nEndTileX; nCntX++ )
{
rLengthCnt = sqrt((XLightPos-(nCntX*TILE_WIDTH+TILE_START_XPOS))*(XLightPos-(nCntX*TILE_WIDTH+TILE_START_XPOS)) +
(YLightPos-(nCntY*TILE_HEIGHT+TILE_START_YPOS))*(YLightPos-(nCntY*TILE_HEIGHT+TILE_START_YPOS)));
if ( nCntX < NUM_CNTX_LIGHTTILE && nCntY < NUM_CNTY_LIGHTTILE )
{
// 器牢飘痢阑 器窃窍瘤 臼绰 谅窍. 器牢飘痢阑 器窃窍瘤 臼绰 快惑.
if ( (nCntX > nX && nCntY < nY) || (nCntX < nX && nCntY > nY) )
{
WORD* pwIndex = ((WORD*)m_pwLightIndices+(nCntX+nCntY*(NUM_CNTX_LIGHTTILE))*6);
*pwIndex++ = (nCntX)+((NUM_CNTX_LIGHTTILE+1)*nCntY);
*pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*nCntY);
*pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));
*pwIndex++ = (nCntX)+((NUM_CNTX_LIGHTTILE+1)*nCntY);
*pwIndex++ = nCntX+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));
*pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));
}
else
{
WORD* pwIndex = ((WORD*)m_pwLightIndices+(nCntX+nCntY*(NUM_CNTX_LIGHTTILE))*6);
*pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*nCntY);
*pwIndex++ = nCntX+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));
*pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));
*pwIndex++ = nCntX+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));
*pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*nCntY);
*pwIndex++ = (nCntX)+((NUM_CNTX_LIGHTTILE+1)*nCntY);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -