C/C++ 新年烟花表白程序【源码+注释】

目录

一、前言

二、源码

三、效果图像

四、资源


前言

祝愿大家,在新的一年心想事成,事业爱情双丰收!

话不多说,直接上源码~


源码

#include <iostream>
#include <graphics.h>
#include <conio.h>
#include <time.h>
#include <mmsystem.h>
#include <math.h>
#pragma comment(lib, "winmm.lib")//多媒体设备接口库文件
#define PI 3.1415
#define NUM 13	//烟花弹数量
#define WIDTH 960
#define HEIGHT 640

struct Jet  //烟花弹
{
	int x, y; //坐标
	int hx, hy; //最高点的坐标
	bool isLaunch; //烟花弹是否在发射中
	IMAGE img[2];
	byte n : 1; //位段  0 1 0 1 0 1 0 1 0 1
}jet[NUM];
struct Fire
{
	int x, y;
	int cen_x, cen_y; //中心点坐标
	int r; //当前绽放半径
	int max_r; //最大绽放半径
	int width, height;
	DWORD pixel[240][240]; //图片像素数组
	bool isShow; //烟花是否准备好了
	bool isDraw; //是否绘制烟花
}fire[NUM];

void InitData(int i)
{
	fire[i].cen_x = 120;
	fire[i].cen_y = 120;
	fire[i].max_r = 120;
	fire[i].r = 0;
	fire[i].width = 240;
	fire[i].height = 240;
	fire[i].isDraw = false;
	fire[i].isShow = false;
}
void bloom(DWORD *pMem)
{
	for (int i = 0; i < NUM; i++)
	{
		if (fire[i].isShow)
		{
			if (fire[i].r < fire[i].max_r)
			{
				fire[i].r++;
				fire[i].isDraw = true; //可以开始绘制烟花了
			}
			if (fire[i].r >= fire[i].max_r)
			{
				InitData(i);
			}
		}
		if (fire[i].isDraw)
		{
			//求当前半径下,圆上的每个点对于的弧度
			for (double a = 0; a <= 2 * PI; a += 0.01)
			{
				int img_x = fire[i].cen_x + fire[i].r * cos(a);//求出圆上的每个点的坐标
				int img_y = fire[i].cen_y + fire[i].r * sin(a);
				if (img_x > 0 && img_x < fire[i].width && img_y>0 && img_y < fire[i].height)
				{
					//针对现在的绽放点,对应的屏幕坐标
					int win_x = fire[i].x + fire[i].r * cos(a);
					int win_y = fire[i].y + fire[i].r * sin(a);
					if (win_x > 0 && win_x < WIDTH && win_y>0 && win_y < WIDTH)
					{
						pMem[win_y * WIDTH + win_x] = BGR(fire[i].pixel[img_x][img_y]);
					}
				}
			}
		}
	}
}
void launch()
{
	for (int i = 0; i < NUM; i++)
	{
		if (jet[i].isLaunch)
		{
			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)
			{
				jet[i].isLaunch = false;
				//可以开始放烟花了
				fire[i].x = jet[i].x;
				fire[i].y = jet[i].y;
				fire[i].isShow = true;
			}
		}
	}
}
void createJet()
{
	int i = rand() % NUM;//[0~13)
	if (jet[i].isLaunch == false)
	{
		jet[i].x = rand() % (WIDTH - 20);
		jet[i].y = rand() % 100 + HEIGHT;
		jet[i].hx = jet[i].x;
		jet[i].hy = rand() % (HEIGHT / 3 * 2);
		jet[i].isLaunch = true;
	}
}
void loadImg()
{
	IMAGE bloomImg, tImg;//初始化绽放效果
	loadimage(&bloomImg, "./kuanian/flower.jpg", 240, 0);

	for (int i = 0; i < NUM; i++)
	{
		InitData(i);
		SetWorkingImage(&bloomImg);//设置当前绘制设备
		getimage(&tImg, i * 240, 0, 240, 240);
		SetWorkingImage(&tImg);

		for (int a = 0; a < 240; a++)
		{
			for (int b = 0; b < 240; b++)
			{
				fire[i].pixel[a][b] = getpixel(a, b);//获取像素值
			}
		}
	}
	IMAGE jetImg;//初始化烟花弹
	loadimage(&jetImg, "./kuanian/launch.jpg", 0, 0);
	SetWorkingImage(&jetImg);

	for (int i = 0; i < NUM; i++)
	{
		int n = rand() % 5;
		getimage(&jet[i].img[0], n * 20, 0, 20, 50);
		getimage(&jet[i].img[1], n * 20 + 100, 0, 20, 50);
		jet[i].isLaunch = false;
	}
	SetWorkingImage();
}
void welcome()
{
	mciSendString("open ./kuanian/咱们结婚吧.mp3", 0, 0, 0);//发送一个命令串到MCI设备 用来播放多媒体文件的API指令 头文件mmsystem.h
	mciSendString("play ./kuanian/咱们结婚吧.mp3", 0, 0, 0);

	for (int i = 0; i < 50; i++)
	{
		cleardevice();//清除屏幕
		int x = 500 + 180 * sin(2 * PI / 60 * i);
		int y = 200 + 180 * cos(2 * PI / 60 * i);
		settextstyle(i, 0, "楷体");//设置字体样式
		settextcolor(RGB(0, 202, 0));
		setbkmode(TRANSPARENT);//设置背景透明
		outtextxy(x, y, "浪漫表白程序");//在xy处输出字符串
		Sleep(20);
	}
	_getch();//按任意键继续 头文件conio.h
	cleardevice();
	settextstyle(25, 0, "楷体");
	outtextxy(350, 100, "亲爱的Husky");
	outtextxy(350, 150, "自从第一天看见你");
	outtextxy(350, 200, "我的心就不能自已");
	outtextxy(350, 250, "不管天上地下都想看见你");
	outtextxy(350, 300, "...");
	outtextxy(350, 350, "...");
	outtextxy(450, 400, "--最喜欢你的我");
}

int main()
{
	initgraph(960, 640);//创建窗口 头文件graphics.h 需自己安装
	srand((unsigned)time(NULL) + clock());//设置随机数种子
	welcome();
	loadImg();
	DWORD* pMem = GetImageBuffer(); //获取窗口的内存指针

	while (1)
	{
		for (int i = 0; i < WIDTH; i++)
		{
			for (int k = 0; k < 4; k++)
			{
				int x = rand() % WIDTH;
				int y = rand() % HEIGHT;
				if (y < HEIGHT)
				{
					pMem[y * WIDTH + x] = BLACK;
				}
			}
		}

		createJet();//产生烟花弹
		launch();//发射烟花弹
		bloom(pMem);
		Sleep(10);
	}
	closegraph();

	system("pause");
	return 0;
}

效果图像

烟花表白

 此外,还可以调整背景图像

int main() {
	initgraph(600, 600);//创建一个窗口
	IMAGE background;//定义一个图片名.
	loadimage(&background,"resources\\background.jpg",600,600,1);//从图片文件获取图像
	putimage(0, 0, &background);//绘制图像到屏幕,图片左上角坐标为(0,0)
	_getch();//防止程序关闭
	closegraph();//关闭窗口
	return 0;
}

资源

 1、咱们结婚吧.mp3(背景音乐,弄一首自己喜欢的)

 2、flower.jpg(烟花绽放图像)

 3、launch.jpg(烟花发射图像)

​​​​​​​

猜你喜欢

转载自blog.csdn.net/Gary_ghw/article/details/128464019