|
|

楼主 |
发表于 2008-7-10 21:51:00
|
显示全部楼层
Re:这是谁做的游戏
这是我写的:
int __stdcall fxLight(HDC DC, int X, int Y, int Color, int Extension, int Intensity, int Definition, int Flags)
{
int ExtensionPOW2 = Extension * Extension;
int DestX = X - Extension;
int DestY = Y - Extension;
int DestWidth = Extension * 2;
int DestHeight = Extension * 2;
if (Extension < 0)
Extension = 0;
if (Intensity < 0)
Intensity = 0;
if (Intensity > 255)
Intensity = 255;
if (Definition < 0)
Definition = 0;
if (Definition > 255)
Definition = 255;
int fxR = fxGetRed(Color);
int fxG = fxGetGreen(Color);
int fxB = fxGetBlue(Color);
BITMAPINFOHEADER BMI;
BMI.biSize = sizeof(BITMAPINFOHEADER);
BMI.biWidth = DestWidth;
BMI.biHeight = DestHeight;
BMI.biPlanes = 1;
BMI.biBitCount = 32;
BMI.biCompression = BI_RGB;
BMI.biSizeImage = 0;
BMI.biXPelsPerMeter = 0;
BMI.biYPelsPerMeter = 0;
BMI.biClrUsed = 0;
BMI.biClrImportant = 0;
/*
BYTE *pDestBits;
HBITMAP hbmDest;
hbmDest = ::CreateDIBSection(DestDC, (BITMAPINFO *)&BMI, DIB_RGB_COLORS, (void **)&pDestBits, NULL, 0l);
*/
BYTE *pSrcBits;
HBITMAP hbmSrc;
hbmSrc = ::CreateDIBSection(DC, (BITMAPINFO *)&BMI, DIB_RGB_COLORS, (void **)&pSrcBits, NULL, 0l);
HDC dc = ::CreateCompatibleDC(NULL);
HBITMAP hbm = (HBITMAP) ::SelectObject(dc, hbmSrc);
if (!::BitBlt(dc, 0, 0, DestWidth, DestHeight, DC, DestX, DestY, SRCCOPY))
return 0;
/*
::SelectObject(dc, hbmDest);
if (!::StretchBlt(dc, 0, 0, DestWidth, DestHeight, DestDC, DestX, DestY, DestWidth, DestHeight, SRCCOPY))
return 0;
*/
::SelectObject(dc, hbm);
: eleteDC(dc);
POINT pt;
RECT rect;
rect.left = 0;
rect.top = 0;
rect.right = DestWidth;
rect.bottom = DestHeight;
double d;
if (Flags == 1)
{
d = ((double)Definition) / 100;
Definition = 0;
}
for (int y = -Extension; y < Extension; y++)
{
pt.y = y + Extension;
LPBYTE pbSrcRGB = (LPBYTE)&((DWORD*)pSrcBits)[pt.y * DestWidth];
for (int x = -Extension; x < Extension; x++)
{
pt.x = x + Extension;
if ((x * x + y * y) < (ExtensionPOW2))
{
if (: tInRect(&rect, pt))
{
int Light = (int)((1 - 1 * sqrt(x * x + y * y) / Extension) * Intensity);
switch (Flags)
{
case 0:
pbSrcRGB[(pt.x * 4) + 0] = fxShadeColors(pbSrcRGB[(pt.x * 4) + 0], fxB, Light);
pbSrcRGB[(pt.x * 4) + 1] = fxShadeColors(pbSrcRGB[(pt.x * 4) + 1], fxG, Light);
pbSrcRGB[(pt.x * 4) + 2] = fxShadeColors(pbSrcRGB[(pt.x * 4) + 2], fxR, Light);
break;
case 1:
pbSrcRGB[(pt.x * 4) + 0] = fxByte(pbSrcRGB[(pt.x * 4) + 0] + (int)(Light * d) + Definition + fxShadeColors(Definition, fxB, Light));
pbSrcRGB[(pt.x * 4) + 1] = fxByte(pbSrcRGB[(pt.x * 4) + 1] + (int)(Light * d) + Definition + fxShadeColors(Definition, fxG, Light));
pbSrcRGB[(pt.x * 4) + 2] = fxByte(pbSrcRGB[(pt.x * 4) + 2] + (int)(Light * d) + Definition + fxShadeColors(Definition, fxR, Light));
break;
case 2:
pbSrcRGB[(pt.x * 4) + 0] = fxByte(fxShadeColors(pbSrcRGB[(pt.x * 4) + 0], fxB, Light) + fxShadeColors(Definition, fxB, Light));
pbSrcRGB[(pt.x * 4) + 1] = fxByte(fxShadeColors(pbSrcRGB[(pt.x * 4) + 1], fxG, Light) + fxShadeColors(Definition, fxG, Light));
pbSrcRGB[(pt.x * 4) + 2] = fxByte(fxShadeColors(pbSrcRGB[(pt.x * 4) + 2], fxR, Light) + fxShadeColors(Definition, fxR, Light));
break;
case 3:
pbSrcRGB[(pt.x * 4) + 0] = fxByte(pbSrcRGB[(pt.x * 4) + 0] + Light + Definition + fxShadeColors(Definition, fxB, Light));
pbSrcRGB[(pt.x * 4) + 1] = fxByte(pbSrcRGB[(pt.x * 4) + 1] + Light + Definition + fxShadeColors(Definition, fxG, Light));
pbSrcRGB[(pt.x * 4) + 2] = fxByte(pbSrcRGB[(pt.x * 4) + 2] + Light + Definition + fxShadeColors(Definition, fxR, Light));
break;
case 4:
pbSrcRGB[(pt.x * 4) + 0] = fxByte(pbSrcRGB[(pt.x * 4) + 0] + Light + Definition);
pbSrcRGB[(pt.x * 4) + 1] = fxByte(pbSrcRGB[(pt.x * 4) + 1] + Light + Definition);
pbSrcRGB[(pt.x * 4) + 2] = fxByte(pbSrcRGB[(pt.x * 4) + 2] + Light + Definition);
break;
default:
pbSrcRGB[(pt.x * 4) + 0] = fxByte(pbSrcRGB[(pt.x * 4) + 0] + (int)(Light * d) + Definition + fxShadeColors(Definition, fxB, Light));
pbSrcRGB[(pt.x * 4) + 1] = fxByte(pbSrcRGB[(pt.x * 4) + 1] + (int)(Light * d) + Definition + fxShadeColors(Definition, fxG, Light));
pbSrcRGB[(pt.x * 4) + 2] = fxByte(pbSrcRGB[(pt.x * 4) + 2] + (int)(Light * d) + Definition + fxShadeColors(Definition, fxR, Light));
break;
}
}
}
}
}
dc = ::CreateCompatibleDC(NULL);
hbm = (HBITMAP) ::SelectObject(dc, hbmSrc);
if (!::BitBlt(DC, DestX, DestY, DestWidth, DestHeight, dc, 0, 0, SRCCOPY))
return 0;
::DeleteDC(dc);
::DeleteObject(hbmSrc);
//::DeleteObject(hbmDest);
return 1;
} |
|