烟花

#include<Windows.h>
#pragma comment(lib,"winmm.lib")
#include<stdio.h>
#include<graphics.h>
#include<iostream>
#include<cstdlib>
#include<time.h>
using namespace std;
int sx[13] = { 100,200,300,400,500,600,700,750,450,250,150,50,650 };
int r[13] = { 120,138,116,117,116,125,117,53,109,126,124,123,121 };//烟花爆炸的最大半径;
int x[13] = { 120, 120, 110, 117, 110, 93,  102, 102, 110, 105, 100, 108, 110 };
int y[13] = { 120, 120, 85,  118, 120, 103, 105, 110, 110, 120, 120, 104, 85 };
struct node
{
	int cen_x;
	int cen_y;
	int x;
	int y;
	int p;//烟花是否绽放
	DWORD t1;//控制烟花绽放的速度
	DWORD t2;
	DWORD dt;
	int xy[240][240];//烟花的像素存放;
	int r;//半径
	int h;
	int max_r;//最大半径
}fl[14];//烟花的结构体
struct node1
{
	int x;
	int y;
	IMAGE k;
	IMAGE l;
	DWORD t1;//控制发射时的速度
	DWORD t2;
	DWORD dt;
	int h;
	int flag;//标记该放哪张图
	int p;//标记烟花是否绽放
	bool show;//是否发射的标志
}a[14];
void load_fire()//存放烟花图片;
{
	IMAGE n, m;
	int i, j, k;
	loadimage(&n, L"1.png", 3120, 240);

	for (i = 0; i < 13; i++)
	{
		SetWorkingImage(&n);
		getimage(&m, i * 240, 0, 240, 240);
		SetWorkingImage(&m);
		for (j = 0; j < 240; j++)
		{
			for (k = 0; k < 240; k++)
			{
				fl[i].xy[j][k] = getpixel(j, k);//将烟花图片的每个像素点的RGB值存放在xy数组里面;
			}
		}

	}
	SetWorkingImage(NULL);//将绘图设备换为原来的设备;
}
void load_jet()//加载烟花弹函数图片
{
	int i;
	IMAGE m, n;
	loadimage(&m, L"2.png", 100, 30);
	SetWorkingImage(&m);
	for (i = 0; i < 5; i++)
	{
		getimage(&n, 10 * i, 0, 10, 30);//总共5组图片,存放明暗两张图片;
		a[i].k = n;
		getimage(&n, 10 * i + 50, 0, 10, 30);
		a[i].l = n;
	}
	SetWorkingImage(NULL);
}
void init(int i)//初始化函数;
{
	a[i].k = a[i % 5].k;
	a[i].l = a[i % 5].l;
	a[i].x = 0;
	a[i].y = 0;
	a[i].flag = 0;
	a[i].h = rand() % 100 + 50;
	a[i].dt = rand() % 10 +5;
	a[i].t1 = timeGetTime();
	a[i].show = false;
	a[i].p = 1;

	fl[i].cen_x = x[rand() % 13];
	fl[i].cen_y = y[rand() % 13];
	fl[i].r = 0;
	fl[i].p = 0;
	fl[i].max_r = r[rand() % 13];//随机选择最大半径
	fl[i].t1 = timeGetTime();
	fl[i].dt = 5;
}
void show(DWORD* pMem)//绽放烟花
{

	int i, j;
	int drt[16] = { 20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,98 };//时间间隔;
	for (i = 0; i < 13; i++)
	{
		fl[i].t2 = timeGetTime();
		if (fl[i].p && fl[i].t2 - fl[i].t1 > fl[i].dt)
		{
			fl[i].t1 = fl[i].t2;
			if (fl[i].r < fl[i].max_r)
			{

				fl[i].r++;
				fl[i].dt = drt[fl[i].r / 10];//随着半径增大,时间间隔增大;
				for (double s = 0; s <= 6.28; s += 0.01)
				{
					int x1 = (int)(fl[i].cen_x + fl[i].r * cos(s));
					int y1 = (int)(fl[i].cen_x - fl[i].r * sin(s));
					if (x1 > 0 && y1 > 0 && x1 < 240 && y1 < 240)
					{

						int b = fl[i].xy[x1][y1] & 0xff;
						int g = (fl[i].xy[x1][y1] >> 8) & 0xff;
						int r = (fl[i].xy[x1][y1] >> 16);
						int xx = (int)(fl[i].x + fl[i].r * cos(s));
						int yy = (int)(fl[i].y - fl[i].r * sin(s));

						if (r > 0x20 && g > 0x20 && b > 0x20 && xx > 0 && xx < 800 && yy > 0 && yy < 500)
							pMem[yy * 800 + xx] = BGR(fl[i].xy[x1][y1]);	// 显存操作绘制烟花

					}
				}
			}
			else
			{
				init(i);
			}
			fl[i].t1 = fl[i].t2;
		}


	}
}
void chose(DWORD &t1)//选择烟花弹发射
{
	DWORD t2 = timeGetTime();
	if (t2 - t1 > 100)//控制烟花弹的发射时间
	{
		int n = rand() %60;
		if (n<13&&a[n].p && a[n].show == false)
		{
			a[n].show = true;
			a[n].x = rand() % 800;
			a[n].y = rand() % 100 + 400;//初始发射的位置
			putimage(a[n].x, a[n].y, &a[n].k, SRCINVERT);
			a[n].flag = 1;
		}
		t1 = t2;
	}
}
void Erase(DWORD* pMem)//删除函数,随机删除像素点
{
	int flag = 1;
	// 随机选择 4000 个像素点擦除
	for (int clr = 0; clr < 500; clr++)
	{
		for (int j = 0; j < 2; j++)
		{
			int px1 = rand() % 1000;
			int py1 = rand() % 600;


			pMem[py1 * 500 + px1] = pMem[py1 * 200 + px1] = BLACK;//将要删除的像素点换成黑色即可

		}
	}
}
int main()
{
	int i;
	srand((unsigned int)time(NULL));//种下随机种子
	initgraph(800, 500);//绘制图形窗口
	DWORD* pMem = GetImageBuffer();//获取显存缓冲区的指针
	mciSendString(TEXT("play 春娇与志明.mp3 repeat"), NULL, 0, NULL);//播放音乐
	settextcolor(YELLOW);
	settextstyle(50, 0, L"宋体");
	load_jet();//加载烟花弹的图片
	load_fire();//加载烟花的图片;
	BeginBatchDraw();//开始绘制图形;
	for (i = 0; i < 13; i++)
	{
		init(i);
	}//初始化
	int sum = 0;
	DWORD t1 = timeGetTime();
	while (1)
	{
		chose(t1);//选择烟花弹发射
		sum++;
		Sleep(5);
		if (sum % 700 == 0)
			outtextxy(rand() % 800, rand() % 300, L"新年快乐");
		Erase(pMem);//消除烟花;
		for (i = 0; i < 13; i++)
		{
			a[i].t2 = timeGetTime();
			if ( a[i].p&&a[i].t2 - a[i].t1 > a[i].dt&&a[i].show==true)//如果可以发射且上升的时间间隔足够。
			{
				if (a[i].flag == 1)//消除暗图,画上明图
				{
					putimage(a[i].x, a[i].y, &a[i].k, SRCINVERT);
					a[i].y -= 10;
					putimage(a[i].x, a[i].y, &a[i].l, SRCINVERT);
					a[i].flag = 0;
				}
				else//消除明图,画上暗图
				{
					putimage(a[i].x, a[i].y, &a[i].l, SRCINVERT);
					a[i].y -= 10;
					putimage(a[i].x, a[i].y, &a[i].k, SRCINVERT);
					a[i].flag = 1;
				}
				FlushBatchDraw();
				if (a[i].y < a[i].h)//如果达到最高高度的话,消除最后的图片
				{
					fl[i].y = a[i].y;
					fl[i].x = a[i].x + 10;
					a[i].p = 0;
					fl[i].p = 1;
					if (a[i].flag == 1)
						putimage(a[i].x, a[i].y, &a[i].k, SRCINVERT);
					else
						putimage(a[i].x, a[i].y, &a[i].l, SRCINVERT);
				}
				else if (a[i].y < a[i].h + 100)///如果快要到达最高点,减缓速度;
				{
					a[i].dt = rand() % 5 + 50;
				}
				a[i].t1 = a[i].t2;
			}
		}
		show(pMem);//烟花绽放
		FlushBatchDraw();
	}
	EndBatchDraw();
	closegraph();
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值