#if !defined(AFX_FIRE_H__4B4BDB0D_AAE7_4E03_A3E4_56CE487F0DED__INCLUDED_)
#define AFX_FIRE_H__4B4BDB0D_AAE7_4E03_A3E4_56CE487F0DED__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "resource.h"
#include "math.h"
#include "mmsystem.h"
#endif // !defined(AFX_FIRE_H__4B4BDB0D_AAE7_4E03_A3E4_56CE487F0DED__INCLUDED_)
#define MaxW (800)
#define MaxH (600)
#define ExLines (4)
#define ExColum (7)
#define SparkNum (10)
#define SparkSize (20)
#define SparkBaseLife (8)
#define DTime (120)
//变量
class ScrColor
{
public:
int color;
POINT V;
POINT F;
}MyColor[MaxH][MaxW];
class Spark
{
public:
int color;
POINT Position;
int Life;
}MySpark[SparkNum];
/*
COLORREF red = RGB(255,0,0);
COLORREF black = RGB(0,0,0);
COLORREF blue = RGB(0,0,255);
COLORREF white = RGB(255,255,255);
COLORREF green = RGB(0,255,0);
COLORREF gray = RGB(128, 128,128);
COLORREF BackColor = black;
*/
COLORREF SCREEN[MaxH][MaxW];
HBITMAP MyBit;
HDC mdc;
int times=0;
int Di=0;
//函数
void SetFire(HWND hWnd);
void GrowFire(HWND hWnd,int flag);
void MyINIT(HWND hWnd,HINSTANCE hInstance);
void MakeSparkOutPut(int x,int y,int x0,int y0,int color);
void MyINIT(HWND hWnd,HINSTANCE hInstance)
{
HDC hdc;
hdc=GetDC(hWnd);
mdc=CreateCompatibleDC(hdc);
MyBit=CreateCompatibleBitmap(hdc,MaxW,MaxH);
SetFire(hWnd);
GrowFire(hWnd,0);
SetTimer(hWnd,1,DTime,NULL);
PlaySound((LPCTSTR)IDR_FLAME, hInstance, SND_RESOURCE | SND_ASYNC | SND_LOOP);
DeleteObject(hdc);
}
void SetFire(HWND hWnd)
{
int i,j,k,l;
int Dw;
Dw=rand()%7-3;
for(i=0;i<MaxW;i+=ExColum+Dw)
{
int j;
MyColor[MaxH-1][i].color=(2*MyColor[MaxH-1][i].color+1*(rand()%200)*(int)(sin((double)(i+Di)/350)+2)+rand()%600+50)/3;//+rand()%50-80;
if(MyColor[MaxH-1][i].color>765) MyColor[MaxH-1][i].color=765-rand()%10;
if(MyColor[MaxH-1][i].color<0) MyColor[MaxH-1][i].color=rand()%10;
for(j=1;j<ExColum+Dw;j++)
if(i+j<MaxW)
MyColor[MaxH-1][i+j].color=MyColor[MaxH-1][i].color;
Dw=rand()%3-1;
}
for(l=0;l<1;l++)
for(i=MaxH-1;i>550;i--)
for(k=ExColum;k<MaxW-ExColum;k++)
{
long SumColor=0;
for(j=0;j<ExColum;j++)
{
SumColor+=MyColor[i][k+j].color+MyColor[i][k-j].color;
}
MyColor[i][k].color=SumColor/(2*j);
}
Di+=20;
// GrowFire(hWnd);
}
void GrowFire(HWND hWnd,int flag)
{
HDC hdc;
int i,j,k;
int brightR=0,brightY=0;
int sparkTem=0;
int num;
int tim=1;
int DWave=0;
hdc=GetDC(hWnd);
// if(flag==0)
{
for(i=MaxH-1;i>0;i--)
{
for(j=3;j<MaxW-3;j++)//宽
{
tim=1;
DWave=0;
//数据交换
k=MaxH-i;
brightR=MyColor[i][j].color;
if(k<ExLines)
{
for(;k>1;k--)
{
brightR+=MyColor[i+k-1][j-1].color;
brightR+=3*MyColor[i+k-1][j].color;
brightR+=MyColor[i+k-1][j+1].color;
tim+=5;
}
}
else
{
int m;
for(m=1;m<ExLines;m++)
{
brightR+=MyColor[i+m][j-1].color;
brightR+=3*MyColor[i+m][j].color;
brightR+=MyColor[i+m][j+1].color;
tim+=5;
}
}
brightR/=tim;
//衰减
brightR-=2;
if(brightR<0)brightR=0;
//着色
MyColor[i][j].color=brightR;
{
long R,G,B;
if(MyColor[i][j].color>255)
{
R=255;
if(MyColor[i][j].color-255>255)
{
G=255;
B=MyColor[i][j].color-510;
}
else
{
G=MyColor[i][j].color-255;
B=0;
}
}
else
{
R=MyColor[i][j].color;
G=0;
B=0;
}
//设置火星
if(R<60 && R>50)
{
sparkTem++;
if(sparkTem==3000)
{
sparkTem=0;
for(num=0;num<SparkNum;num++)
if(MySpark[num].Life==0)
{
MySpark[num].Position.x=i;
MySpark[num].Position.y=j;
MySpark[num].color=rand()%20+500;
MySpark[num].color=(MySpark[num].color>765?765:MySpark[num].color);
MySpark[num].Life=(rand()%5+SparkBaseLife);
MyColor[i][j].color=MySpark[num].color;
break;
}
}
}
}
}
}
}
//着色
long COLOR;
for(i=MaxH-1;i>0;i--)//高
{
for(j=1;j<MaxW-2;j++)//宽
{
long R,G,B;
COLOR=MyColor[i][j].color;
if(COLOR>255)
{
R=255;
if(COLOR-255>255)
{
G=255;
B=COLOR-510;
}
else
{
G=COLOR-255;
B=0;
}
}
else
{
R=COLOR;
G=0;
B=0;
}
if(R!=255)
{
SCREEN[i][j]=R*256*256;
}
else
SCREEN[i][j]=R*256*256+(G-R)*256+(B-R);
}
}
//火星模糊化
for(num=0;num<SparkNum;num++)
{
if(MySpark[num].Life!=0)
{
int x,y;
int i,j;
x=MySpark[num].Position.x;
y=MySpark[num].Position.y;
for(j=1;j<SparkSize;j++)
{
for(i=0;j*j+i*i<SparkSize*SparkSize;i++)
{
MakeSparkOutPut(x+i,y+j,x,y,MySpark[num].color);
MakeSparkOutPut(x+j,y+i,x,y,MySpark[num].color);
MakeSparkOutPut(x-i,y+j,x,y,MySpark[num].color);
MakeSparkOutPut(x-j,y+i,x,y,MySpark[num].color);
MakeSparkOutPut(x+i,y-j,x,y,MySpark[num].color);
MakeSparkOutPut(x+j,y-i,x,y,MySpark[num].colo