eaxyx烟花程序学习

//VS2019可直接运行
#undef UNICODE
#undef _UNICODE
#include <stdio.h>		//标准的输入输出头文件。
#include <graphics.h>   //EasyX图形界面。
#include <time.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
#include<Windows.h>
#include<mmsystem.h>
#pragma comment(lib,"winmm.lib")
#define PI 3.14159265358

void Shoot();
void LoadImg();
void Choise(DWORD& t1);
void GameInit(int i);
void Show(DWORD* pmem);
void welcome();
void Style(DWORD& st1);
void CheckOver();//判断程序是否结束

 //烟花
struct Fire
{
	int		r;  //半径
	int		max_r;
	int		x, y;
	int		cen_x, cen_y;
	int		width, height;
	int		xy[240][240];  //像素数组图片!
	bool	show;
	bool	draw;
	DWORD	t1, t2, dt;
}fire[13];


//烟花弹
struct Jet		//类
{
	int		x, y;			//坐标
	int		hx, hy;			//最高点的坐标
	IMAGE	img[2];			//图片数组 存放一明一暗两张图片。
	DWORD	t1, t2, dt;		//控制速度
	bool	shoot;          //是否发射
	byte	n : 1;			//C语言结构体:位段
	int height;             //烟花最大高度
}jet[13];  //13个sizeof(Jet) 描述烟花弹。


int main()
{

	srand((unsigned int)time(NULL));
	//初始化图形界面 打开一个 1200x800 的窗口!
	initgraph(1200, 800);
	setbkcolor(WHITE); cleardevice();

	welcome();
	DWORD t1 = GetTickCount();
	DWORD st1 = GetTickCount();
	DWORD* pmem = GetImageBuffer();

	for (int i = 0; i < 13; i++)
	{
		GameInit(i); //初始化是3个内存的一些其他数据
	}
	LoadImg();  //初始化13个内存的图片数组
	BeginBatchDraw();
	while (1)
	{
		Sleep(5);
		for (int i = 0; i < 1000; i++)
		{
			for (int j = 0; j < 2; j++)
			{
				int px1 = rand() % 1200;
				int py1 = rand() % 800;
				if (py1 < 799)
				{
					pmem[py1 * 1200 + px1] = pmem[py1 * 1200 + px1 + 1] = BLACK;
				}
			}
		}
		Choise(t1);
		Shoot();
		Show(pmem);
		Style(st1);
		CheckOver();
		FlushBatchDraw();
	}

}


void welcome()
{
	settextstyle(50, 0, "楷体");
	settextcolor(BLACK);
	outtextxy(290, 300, "南京邮电大学一年级小学生!");
	Sleep(1000);
	cleardevice();
}


void GameInit(int i)
{
	int r[13] = { 120, 120, 155, 123, 130, 147, 138, 138, 130, 135, 140, 132, 155 };
	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 };

	fire[i].x = 0;
	fire[i].y = 0;
	fire[i].width = 240;
	fire[i].height = 240;
	fire[i].max_r = r[i];
	fire[i].cen_x = x[i];
	fire[i].cen_y = y[i];
	fire[i].show = false;
	//	fire[i].draw = false;
	fire[i].dt = 5;
	fire[i].t1 = GetTickCount();
	fire[i].r = 0;

	//初始化烟花弹
	jet[i].x = -240;
	jet[i].y = -240;
	jet[i].hx = -240;
	jet[i].hy = -240;
	jet[i].height = 0;
	jet[i].t1 = GetTickCount();  //获取系统时间。
	jet[i].dt = rand() % 10; //0-9 ms
	jet[i].n = 0;
	jet[i].shoot = false;
}

void LoadImg()
{
	IMAGE flower, fimg;
	loadimage(&flower, "flower.jpg", 3120, 240);
	setbkcolor(BLACK); cleardevice();
	for (int i = 0; i < 13; i++)
	{
		SetWorkingImage(&flower);
		getimage(&fimg, i * 240, 0, 240, 240);
		SetWorkingImage(&fimg);

		for (int a = 0; a < 240; a++)
		{
			for (int b = 0; b < 240; b++)
			{
				fire[i].xy[a][b] = getpixel(a, b);
			}
		}
	}

	IMAGE jetimg;
	loadimage(&jetimg, "shoot.jpg", 200, 50);

	for (int i = 0; i < 13; i++)
	{
		SetWorkingImage(&jetimg);  //从jetimg获取
		int n = rand() % 5;  //0-4
		getimage(&jet[i].img[0], n * 20, 0, 20, 50);
		getimage(&jet[i].img[1], (n + 5) * 20, 0, 20, 50);
	}
	SetWorkingImage(NULL);  //从jetimg获取
}

void Choise(DWORD& t1)
{
	DWORD t2 = GetTickCount();
	if (t2 - t1 > 200)  //时间间隔100ms
	{
		int i = rand() % 20; //随机选一个 
		if (i < 13 && jet[i].shoot == false && fire[i].show == false)
		{
			jet[i].x = rand() % 1200;
			jet[i].y = rand() % 100 + 600; //0-99  +600
			jet[i].hx = jet[i].x;
			jet[i].hy = rand() % 400;
			jet[i].height = jet[i].y - jet[i].hy;
			jet[i].shoot = true;

			putimage(jet[i].x, jet[i].y, &jet[i].img[jet[i].n], SRCINVERT);
		}
		t1 = t2;
	}
}


void Shoot()  
{
	for (int i = 0; i < 13; i++)
	{
		jet[i].t2 = GetTickCount();
		if (jet[i].t2 - jet[i].t1 > jet[i].dt && jet[i].shoot == true)
		{
			putimage(jet[i].x, jet[i].y, &jet[i].img[jet[i].n], SRCINVERT);
			if (jet[i].y > jet[i].hy) //没有到达最高点!
			{
				jet[i].y -= 5;
				jet[i].n++;
			}
			putimage(jet[i].x, jet[i].y, &jet[i].img[jet[i].n], SRCINVERT);
			if ((jet[i].y - jet[i].hy) * 4 < jet[i].height)
			{
				jet[i].dt = rand() % 4 + 10;
			}
			if (jet[i].y <= jet[i].hy)
			{
				putimage(jet[i].x, jet[i].y, &jet[i].img[jet[i].n], SRCINVERT);

				fire[i].x = jet[i].hx + 10;
				fire[i].y = jet[i].y;
				jet[i].shoot = false; //烟花弹重新利用
				fire[i].show = true;
			}
			jet[i].t1 = jet[i].t2;
		}
	}
}

void Style(DWORD& st1)
{
	DWORD st2 = GetTickCount();
	if (st2 - st1 == 10000 || st2 - st1 == 25000 || st2 - st1 == 40000)
	{
		int x[13] = { 60,75,91,100,95,75,60,45,25,15,25,41,60 };
		int y[13] = { 65,53,40,22,5,4,20,4,5,22,40,53,65 };
		for (int i = 0; i < 13; i++)
		{
			/*分布烟花弹*/
			cleardevice();
			jet[i].x = x[i] * 10;
			jet[i].y = (y[i] + 75) * 10;
			jet[i].hx = jet[i].x;
			jet[i].hy = y[i] * 10;
			jet[i].height = jet[i].y - jet[i].hy;
			jet[i].shoot = true;
			jet[i].dt = 7;
			putimage(jet[i].x, jet[i].y, &jet[i].img[jet[i].n], SRCINVERT);

			/*设置烟花参数*/
			fire[i].x = jet[i].x + 10;
			fire[i].y = jet[i].hy;
			fire[i].show = false;
			fire[i].r = 0;
		}
		settextcolor(RED);
		settextstyle(100, 0, "宋体");
		outtextxy(530, 300, "520");
	}
}

void Show(DWORD* pmem)
{
	int drt[16] = { 5, 5, 5, 5, 5, 6,25, 25, 25, 25, 55, 55, 55, 55, 55, 55 };
	for (int i = 0; i < 13; i++)
	{
		fire[i].t2 = GetTickCount();
		if (fire[i].t2 - fire[i].t1 > fire[i].dt && fire[i].show == true)
		{
			if (fire[i].r < fire[i].max_r)
			{
				fire[i].r++;
				fire[i].dt = drt[fire[i].r / 10];
				fire[i].draw = true;
			}
			if (fire[i].r >= fire[i].max_r - 1)
			{
				fire[i].draw = false;
				GameInit(i);
			}
			fire[i].t1 = fire[i].t2;
		}

		if (fire[i].draw == true)
		{
			//弧度
			for (double a = 0; a <= 6.28; a += 0.02)  //int  double  ++
			{
				int x1 = (int)(fire[i].cen_x + fire[i].r * cos(a));
				int y1 = (int)(fire[i].cen_y - fire[i].r * sin(a));

				if (x1 > 0 && x1 < fire[i].width && y1 > 0 && y1 < fire[i].height)
				{
					int b = fire[i].xy[x1][y1] & 0xff;
					int g = (fire[i].xy[x1][y1] >> 8) & 0xff;
					int r = (fire[i].xy[x1][y1] >> 16);

					int xx = (int)(fire[i].x + fire[i].r * cos(a));
					int yy = (int)(fire[i].y - fire[i].r * sin(a));

					if (r > 0x20 && g > 0x20 && b > 0x20 && xx > 0 && xx < 1200 && yy>0 && yy < 800)
					{
						pmem[yy * 1200 + xx] = BGR(fire[i].xy[x1][y1]);
					}
				}
			}
			fire[i].draw = false;
		}
	}
}

void CheckOver()
{
	static DWORD t1 = timeGetTime();
	DWORD t2 = timeGetTime();
	if (t2 - t1 > 8000)  //8秒后结束!
	{
		cleardevice();
		exit(0);
	}
}

将两张烟花图片放入如第二张图片所示的位置。文件名与图片所示的名称一致。在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

亦是远方

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值