Jadual Kandungan
用c语言编写动态烟花的方法:" >用c语言编写动态烟花的方法:
效果展示" >效果展示
总体框架
逻辑关系
源代码
素材
总结
Rumah pembangunan bahagian belakang Tutorial C#.Net 如何用c语言编写动态烟花

如何用c语言编写动态烟花

Oct 30, 2020 am 09:55 AM
c bahasa

用c语言编写动态烟花的方法:首先绘制菜单界面显示文字;然后设置烟花有上升阶段和爆炸阶段,定义烟花和烟花弹结构体;最后初始化数据,加载资源贴图,随机发射数目随机。

如何用c语言编写动态烟花

用c语言编写动态烟花的方法:

效果展示

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

总体框架

/*****************************************
*            项目名称:浪漫烟花
*            项目描述:贴图
*            项目环境:vs2019
*            生成日期:2020-9-7
*            作者所属:追梦
*****************************************/#include<graphics.h>#include<stdio.h>#include<stdlib.h>#include<windows.h>#define NUM 10			//烟花弹个数,烟花//烟花弹struct jet{
	int x, y;			//烟花弹坐标
	int hx, hy;			//烟花弹最高点坐标
	bool shoot;			//烟花弹是否处于发射状态
	DWORD t1, t2, dt;	//发射时间  引爆时间  间隔时间
	IMAGE img[2];		//2张图片 一明一暗 01下标
	byte n : 1;			//C结构体 位段	//n 变量 1个位	0,1 n++ 0,1,0,1}jet[NUM];				//烟花弹个数//烟花struct Fire{
	int x, y;				//烟花的坐标
	int r;					//烟花的半径
	int max_r;				//烟花的最大半径
	int cen_x, cen_y;		//中心距左上角的距离
	int width, height;		//长宽
	int xy[240][240];		//重要,像素,矩阵
	bool draw;				//画出
	bool show;				//显示
	DWORD t1, t2, dt;		//发射时间  引爆时间  间隔时间}fire[NUM];//初始化函数void FireInit(){}//加载资源void Load(){}//选择烟花弹void ChoiceJet(){}//判断发射void Shoot(){}//显示烟花void ShowFire(){}//菜单界面void welcome(){}//主函数int main(){
	//初始界面(1000,600)
	initgraph(1000, 600);
	welcome();
	Load();
	while (1)
	{
		ChoiceJet();
		Shoot();
		ShowFire();
	}
	system("pause");
	return 0;}
Salin selepas log masuk

逻辑关系

首先绘制菜单界面显示文字。烟花有上升阶段和爆炸阶段,定义烟花和烟花弹结构体。
烟花:坐标位置,爆炸的半径大小,最大半径,中心距左上角的距离,长宽,像素,时间等。
烟花弹:坐标位置,最高点,是否发射,时间,个数等。
初始化数据。加载资源贴图。随机发射数目随机,

源代码

/*****************************************
*            项目名称: 浪漫烟花
*            项目描述:贴图
*            项目环境:vs2019
*            生成日期:2020-9-7
*            作者所属:追梦
*****************************************/#include<graphics.h>#include<time.h>#include<stdlib.h>#include<math.h>#include<windows.h>#pragma comment(lib,"winmm.lib")#define NUM 10			//烟花弹个数,烟花#define PI 3.1415925//烟花弹struct jet{
	int x, y;			//烟花弹坐标
	int hx, hy;			//烟花弹最高点坐标
	bool shoot;			//烟花弹是否处于发射状态
	DWORD t1, t2, dt;	//发射时间  引爆时间  间隔时间
	IMAGE img[2];		//2张图片 一明一暗 01下标
	byte n : 1;			//C结构体 位段	//n 变量 1个位	0,1 n++ 0,1,0,1}jet[NUM];				//烟花弹个数//烟花struct Fire{
	int x, y;				//烟花的坐标
	int r;					//烟花的半径
	int max_r;				//烟花的最大半径
	int cen_x, cen_y;		//中心距左上角的距离
	int width, height;		//长宽
	int xy[240][240];		//重要,像素,矩阵
	bool draw;				//画出
	bool show;				//显示
	DWORD t1, t2, dt;		//发射时间  引爆时间  间隔时间}fire[NUM];
Salin selepas log masuk

初始化函数

void FireInit(int i){
	//初始化烟花弹
	jet[i].t1 = GetTickCount();	//GetTickCount()返回从操作系统启动到当前所经过的毫秒数。使用前包含windows.h。
	jet[i].shoot = false;		//未发射
	jet[i].dt = 10;				//上升时间
	jet[i].n = 0;				//初始化烟花
	fire[i].show = false;		//未引爆
	fire[i].r = 0;
	fire[i].dt = 5;				//上升时间
	fire[i].t1 = GetTickCount();
	fire[i].max_r = rand() % 50 + 100;	//100-149
	fire[i].cen_x = rand() % 30 + 80;	//中心距左上角的距离
	fire[i].cen_y = rand() % 30 + 80;	//
	fire[i].width = 240;				//宽
	fire[i].height = 240;				//长}
Salin selepas log masuk

加载

void Load(){
	//加载烟花弹
	IMAGE jetimg;
	loadimage(&jetimg, L"./fire/shoot.jpg", 200, 50);
	SetWorkingImage(&jetimg);
	for (int i = 0; i < NUM; i++)
	{
		int n = rand() % 5;			//01234
		getimage(&jet[i].img[0], n * 20, 0, 20, 50);
		getimage(&jet[i].img[1], (n + 5) * 20, 0, 20, 50);
	}
	SetWorkingImage(NULL);
	//加载烟花
	IMAGE fireimage, Fireimage;
	loadimage(&Fireimage, L"./fire/flower.jpg", 3120, 240);
	for (int i = 0; i < NUM; i++)
	{
		SetWorkingImage(&Fireimage);
		getimage(&fireimage, i * 240, 0, 240, 240);
		SetWorkingImage(&fireimage);
		for (int a = 0; a < 240; a++)
		{
			for (int b = 0; b < 240; b++)
			{
				fire[i].xy[a][b] = getpixel(a, b);
			}
		}
	}
	SetWorkingImage(NULL);}
Salin selepas log masuk

选择烟花弹

void ChoiceJet(DWORD& t1){
	DWORD t2 = GetTickCount();
	if (t2 - t1 > 100)		//烟花弹出现的时间间隔100ms
	{
		//烟花弹个数
		int i = rand() % 10;
		//不处于发射状态
		if (jet[i].shoot == false && fire[i].show == false)
		{
			//烟花弹
			jet[i].x = rand() % 1000;
			jet[i].y = rand() % 100 + 450;	//450-549
			jet[i].hx = jet[i].x;
			jet[i].hy = rand() % 300;		//0-299
			jet[i].shoot = true;			//发射状态

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

判断发射

void Shoot(){
	for (int i = 0; i < NUM; 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].n++;			//闪烁
				jet[i].y -= 5;
			}
			putimage(jet[i].x, jet[i].y, &jet[i].img[jet[i].n], SRCINVERT);

			if (jet[i].y <= jet[i].hy)
			{
				putimage(jet[i].x, jet[i].y, &jet[i].img[jet[i].n], SRCINVERT);
				jet[i].shoot = false;
				//达到最大高度,接下来交给烟花
				//重新发射
				fire[i].x = jet[i].hx;
				fire[i].y = jet[i].hy;
				fire[i].show = true;
			}
		}
		jet[i].t1 = jet[i].t2;
	}}
Salin selepas log masuk
//显示烟花void ShowFire(DWORD* pMem){
	int drt[16] = { 5, 5, 5, 5, 5, 10, 25, 25, 25, 25, 55, 55, 55, 55, 55, 65 };

	for (int i = 0; i < NUM; 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;
				FireInit(i);
			}
			fire[i].t1 = fire[i].t2;
			// 如果该号炮花可爆炸,根据当前爆炸半径画烟花,颜色值接近黑色的不输出。
			if (fire[i].draw)
			{
				for (double a = 0; a <= 6.28; a += 0.01)
				{
					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 < 1000 && yy >0 && yy < 600)
						{
							pMem[yy * 1000 + xx] = BGR(fire[i].xy[x1][y1]);
						}
						fire[i].draw = false;
					}
				}
			}
		}
	}}
Salin selepas log masuk

菜单界面

void welcome(){
	setcolor(YELLOW);
	for (int i = 0; i < 50; i++)
	{
		int x = 600 + int(180 * sin(PI * 2 * i / 60));
		int y = 200 + int(180 * cos(PI * 2 * i / 60));
		cleardevice();
		settextstyle(i, 0, L"楷体");
		outtextxy(x - 80, y, L"一首小辛运送上");
		outtextxy(x - 10, y + 100, L"献给所有编程大佬");
		Sleep(65);
	}
	Sleep(130);
	cleardevice();
	settextstyle(25, 0, L"楷体");
	outtextxy(400, 200, L"原来你是我最想留住的幸运");
	outtextxy(400, 250, L"原来我们和爱情曾经靠得那么近");
	outtextxy(400, 300, L"那为我对抗世界的决定");
	outtextxy(400, 350, L"那陪我淋的雨");
	outtextxy(400, 400, L"一幕幕都是你");
	outtextxy(400, 450, L"-尘不染的真心");
	outtextxy(650, 500, L"小幸运");
	Sleep(2000);
	cleardevice();}
Salin selepas log masuk

主函数

int main(){
	//初始界面(1000,600)
	initgraph(1000, 600);
	//初始化种子
	srand((unsigned int)time(NULL));
	//音乐 爱的翅膀
	mciSendString(L"open ./fire/bk1.mp3 alias music", 0, 0, 0);	//send(发送)	string(字符串)
	mciSendString(L"play music", 0, 0, 0);
	//其它音乐类型 wav PlaySound()
	//0,0,0 音乐播放器时:播放设备,快进设备 快退 暂停
	welcome();
	DWORD t1 = GetTickCount();
	DWORD* pMem = GetImageBuffer();
	for (int i = 0; i < NUM; i++)
	{
		FireInit(i);
	}
	Load();
	BeginBatchDraw();
	while (1)
	{
		// 随机选择像素点擦除
		for (int clr = 0; clr < 200; clr++)
		{
			int px1 = rand() % 1000;
			int py1 = rand() % 600;

			// 防止越界
			if (py1 < 599)
			{
				//对显存赋值擦除像素点
				pMem[py1 * 1000 + px1] = pMem[py1 * 1000 + px1 + 1] = BLACK;
			}
		}
		ChoiceJet(t1);
		Shoot();
		ShowFire(pMem);
		FlushBatchDraw();
	}
	system("pause");
	return 0;}
Salin selepas log masuk

素材

两张图片放在fire文件夹下面。音乐的话自己随便找一首放进去,就可以播放了。
在这里插入图片描述
在这里插入图片描述

总结

需要安装图形库,以及了解相关的知识,素材路径的话也要写对,不然是没有效果的。

相关学习推荐:C视频教程

Atas ialah kandungan terperinci 如何用c语言编写动态烟花. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Akan R.E.P.O. Ada Crossplay?
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Struktur Data Bahasa C: Perwakilan Data dan Operasi Pokok dan Grafik Struktur Data Bahasa C: Perwakilan Data dan Operasi Pokok dan Grafik Apr 04, 2025 am 11:18 AM

Struktur Data Bahasa C: Perwakilan data pokok dan graf adalah struktur data hierarki yang terdiri daripada nod. Setiap nod mengandungi elemen data dan penunjuk kepada nod anaknya. Pokok binari adalah jenis pokok khas. Setiap nod mempunyai paling banyak dua nod kanak -kanak. Data mewakili structtreenode {intData; structtreenode*left; structtreenode*right;}; Operasi mewujudkan pokok traversal pokok (predecision, in-order, dan kemudian pesanan) Node Node Carian Pusat Node Node adalah koleksi struktur data, di mana unsur-unsur adalah simpul, dan mereka boleh dihubungkan bersama melalui tepi dengan data yang betul atau tidak jelas yang mewakili jiran.

Kebenaran di sebalik masalah operasi fail bahasa C Kebenaran di sebalik masalah operasi fail bahasa C Apr 04, 2025 am 11:24 AM

Kebenaran mengenai masalah operasi fail: Pembukaan fail gagal: Kebenaran yang tidak mencukupi, laluan yang salah, dan fail yang diduduki. Penulisan data gagal: Penampan penuh, fail tidak boleh ditulis, dan ruang cakera tidak mencukupi. Soalan Lazim Lain: Traversal fail perlahan, pengekodan fail teks yang salah, dan kesilapan bacaan fail binari.

Pengaturcaraan Multithreaded Bahasa C: Panduan dan Penyelesaian Masalah Pemula Pengaturcaraan Multithreaded Bahasa C: Panduan dan Penyelesaian Masalah Pemula Apr 04, 2025 am 10:15 AM

C Language Multithreading Programming Guide: Mencipta Threads: Gunakan fungsi pthread_create () untuk menentukan id thread, sifat, dan fungsi benang. Penyegerakan Thread: Mencegah persaingan data melalui mutexes, semaphores, dan pembolehubah bersyarat. Kes praktikal: Gunakan multi-threading untuk mengira nombor Fibonacci, menetapkan tugas kepada pelbagai benang dan menyegerakkan hasilnya. Penyelesaian Masalah: Menyelesaikan masalah seperti kemalangan program, thread stop responses, dan kesesakan prestasi.

CS-Week 3 CS-Week 3 Apr 04, 2025 am 06:06 AM

Algorithms are the set of instructions to solve problems, and their execution speed and memory usage vary. In programming, many algorithms are based on data search and sorting. Artikel ini akan memperkenalkan beberapa algoritma pengambilan data dan penyortiran. Carian linear mengandaikan bahawa terdapat array [20,500,10,5,100,1,50] dan perlu mencari nombor 50. Algoritma carian linear memeriksa setiap elemen dalam array satu demi satu sehingga nilai sasaran dijumpai atau array lengkap dilalui. Carta aliran algoritma adalah seperti berikut: kod pseudo untuk carian linear adalah seperti berikut: periksa setiap elemen: jika nilai sasaran dijumpai: pulih semula benar-benar pelaksanaan bahasa palsu c: #termasuk #termasukintmain (tidak sah) {i

Cara mengeluarkan undur dalam bahasa C Cara mengeluarkan undur dalam bahasa C Apr 04, 2025 am 08:54 AM

Bagaimana untuk mengeluarkan undur di C? Jawapan: Gunakan pernyataan gelung. Langkah -langkah: 1. Tentukan pembolehubah N dan simpan nombor undur ke output; 2. Gunakan gelung sementara untuk terus mencetak n sehingga n adalah kurang dari 1; 3. Dalam badan gelung, cetak nilai n; 4. Pada akhir gelung, tolak n dengan 1 untuk mengeluarkan timbal balik yang lebih kecil seterusnya.

Struktur Data Bahasa C: Peranan utama struktur data dalam kecerdasan buatan Struktur Data Bahasa C: Peranan utama struktur data dalam kecerdasan buatan Apr 04, 2025 am 10:45 AM

Struktur Data Bahasa C: Gambaran keseluruhan peranan utama struktur data dalam kecerdasan buatan dalam bidang kecerdasan buatan, struktur data adalah penting untuk memproses sejumlah besar data. Struktur data menyediakan cara yang berkesan untuk mengatur dan mengurus data, mengoptimumkan algoritma dan meningkatkan kecekapan program. Struktur data biasa yang biasa digunakan struktur data dalam bahasa C termasuk: Arrays: Satu set item data yang disimpan berturut -turut dengan jenis yang sama. Struktur: Jenis data yang menganjurkan pelbagai jenis data bersama -sama dan memberi mereka nama. Senarai Terkait: Struktur data linear di mana item data disambungkan bersama oleh petunjuk. Stack: Struktur data yang mengikuti prinsip terakhir (LIFO) yang terakhir. Baris: Struktur data yang mengikuti prinsip pertama (FIFO) pertama. Kes Praktikal: Jadual bersebelahan dalam teori graf adalah kecerdasan buatan

Konsep fungsi bahasa c dan format definisi mereka Konsep fungsi bahasa c dan format definisi mereka Apr 03, 2025 pm 11:33 PM

F Fungsi bahasa adalah blok kod yang boleh diguna semula, menerima parameter untuk pemprosesan, dan hasil pulangan. Ia sama dengan pisau tentera Swiss, berkuasa dan memerlukan penggunaan yang teliti. Fungsi termasuk unsur -unsur seperti menentukan format, parameter, nilai pulangan, dan badan fungsi. Penggunaan lanjutan termasuk penunjuk fungsi, fungsi rekursif, dan fungsi panggil balik. Kesalahan umum adalah jenis ketidakcocokan dan lupa untuk mengisytiharkan prototaip. Kemahiran penyahpepijatan termasuk pembolehubah percetakan dan menggunakan debugger. Pengoptimuman prestasi menggunakan fungsi dalam talian. Reka bentuk fungsi harus mengikuti prinsip tanggungjawab tunggal. Kemahiran dalam fungsi bahasa C dapat meningkatkan kecekapan pengaturcaraan dan kualiti kod.

Petua Penyelesaian Masalah untuk memproses fail dalam bahasa C Petua Penyelesaian Masalah untuk memproses fail dalam bahasa C Apr 04, 2025 am 11:15 AM

Petua Penyelesaian Masalah Untuk fail pemprosesan bahasa C Apabila memproses fail dalam bahasa C, anda mungkin menghadapi pelbagai masalah. Berikut adalah masalah biasa dan penyelesaian yang sepadan: Masalah 1: Tidak dapat membuka kod fail: fail*fp = fopen ("myfile.txt", "r"); jika (fp == null) {// pembukaan fail gagal} charbuffer [100]; size_tread_bytes = fread (buffer, 1, siz

See all articles