最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++實(shí)現(xiàn)動(dòng)態(tài)煙花代碼

 更新時(shí)間:2023年01月27日 09:31:31   作者:某一個(gè)軒  
這篇文章主要介紹了利用C++實(shí)現(xiàn)的放煙花程序,用到了EGE圖形庫(kù),文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C++有一定幫助,需要的可以參考一下

寫在前面

首先,祝大家新年快樂(lè)!

即將迎來(lái)新的一年——癸卯兔年,祝大家成績(jī)、事業(yè)“兔”飛猛進(jìn),必定紅紅火火!

在這篇文章中,將用煙花致以大家最好的祝福!

煙花代碼將會(huì)用到 Easyx 圖形庫(kù),可以去官網(wǎng)下載:easyx.cn

代碼思路

1 煙花結(jié)構(gòu)體

2 初始化煙花

3 煙花上升

4 煙花爆炸

5 繪制煙花

不需要任何圖片、音效(本來(lái)想加的,你要加自己加吧)

開始編寫

提前聲明:代碼純?cè)瓌?chuàng)!

需要用到的頭文件以及宏:

#include <graphics.h>
#include <math.h>
#include <time.h>
#include <stdio.h>
#define MAXNUM 15
#define WIDTH 640
#define HEIGHT 480
#define PI 3.1415926

graphics.h Easyx圖形庫(kù)

math.h 計(jì)算煙花位置

time.h 選取隨機(jī)種子

stdio.h 標(biāo)準(zhǔn)輸入輸出頭文件

MAXNUM 煙花數(shù)量

WIDTH , HEIGHT 窗口的寬、高

PI 圓周率常量,結(jié)合數(shù)學(xué)庫(kù)計(jì)算煙花位置

1 煙花結(jié)構(gòu)體

定義的參數(shù)如下:

nowx , nowy 現(xiàn)在坐標(biāo)

endy 爆炸高度

radio 爆炸半徑

explode 爆炸進(jìn)度

rgb[3] 煙花顏色rgb值

color 煙花顏色

struct Fire
{
	int nowx;
	int nowy;
	int endy;
	int radio;
	int explode;
	int rgb[3];
	COLORREF color;
}fire[MAXNUM];

2 初始化煙花

nowx , nowy 窗口外的隨機(jī)位置

endy 隨即高度

radio 隨即半徑

explode 一開始設(shè)為0

rgb[3] 一些特定的顏色隨機(jī)取

color 按照rgb值

void Init()
{
	for (int i = 0; i < MAXNUM; i++)
	{
		fire[i].nowx = rand() % WIDTH;
		fire[i].nowy = HEIGHT + rand() % 250 + 50;
		fire[i].endy = rand() % 100 + 10;
		fire[i].radio = rand() % 50 + 120;
		fire[i].explode = 0;
		int c[][3] = { {255, 0, 0}, {210, 190, 255}, {255, 120, 0}, {255, 0, 150}, {255, 240, 100}, {10, 255, 255}, {160, 10, 255}, {255, 200, 60} };
		int n = rand() % 8;
		fire[i].color = RGB(c[n][0], c[n][1], c[n][2]);
		fire[i].rgb[0] = c[n][0];
		fire[i].rgb[1] = c[n][1];
		fire[i].rgb[2] = c[n][2];
	}
}

3 煙花上升

y坐標(biāo) 還沒(méi)到達(dá)爆炸高度時(shí)一直上升

for (int i = 0; i < MAXNUM; i++)
{
	if (fire[i].nowy > fire[i].endy)
	{
		fire[i].nowy -= 3;
	}
}

4 煙花爆炸

爆炸進(jìn)度 explode 不斷增加,如果到達(dá)爆炸半徑,就重新初始化。(接上面的if語(yǔ)句)

else
{
	if (fire[i].explode >= fire[i].radio)
	{
		fire[i].nowx = rand() % WIDTH;
		fire[i].nowy = HEIGHT + rand() % 250 + 50;
		fire[i].endy = rand() % 100 + 10;
		fire[i].radio = rand() % 50 + 120;
		fire[i].explode = 0;
		int c[][3] = { {255, 0, 0}, {210, 190, 255}, {255, 120, 0}, {255, 0, 150}, {255, 240, 100}, {10, 255, 255}, {160, 10, 255}, {255, 200, 60} };
		int n = rand() % 8;
		fire[i].color = RGB(c[n][0], c[n][1], c[n][2]);
		fire[i].rgb[0] = c[n][0];
		fire[i].rgb[1] = c[n][1];
		fire[i].rgb[2] = c[n][2];
	}
	else fire[i].explode++;
}

5 繪制煙花

上升

繪制5個(gè)圓,大小從大到小,顏色從深到淺(增加rgb值)

for (int i = 0; i < MAXNUM; i++)
{
	if (fire[i].nowy > fire[i].endy)
	{
		for (int size = 5; size > 0; size--)
		{
			int temp[] = { fire[i].rgb[0], fire[i].rgb[1], fire[i].rgb[2] };
			for (int k = 0; k < 3; k++)
			{
				temp[k] += 50 * (5 - size);
				if (temp[k] > 255) temp[k] = 255;
			}
			setfillcolor(RGB(temp[0], temp[1], temp[2]));
			solidcircle(fire[i].nowx, fire[i].nowy + 15*(10 - size), size);
		}
	}
}

爆炸

重頭戲!重頭戲!重頭戲!需要一些簡(jiǎn)(fù)單(zá)的數(shù)(gāo)學(xué)(děng)常(shù)識(shí)(xúe)!

顏色漸變的實(shí)現(xiàn)方式跟前面一樣,只不過(guò)這里要用三角函數(shù)計(jì)算坐標(biāo),再用萬(wàn)有引力、拋物線等改變 y坐標(biāo),讓它看得更真實(shí)!(牛頓:算你小子識(shí)相)

具體如何計(jì)算坐標(biāo),看我的文章,里面有說(shuō)如何計(jì)算

然后是萬(wàn)有引力,大概需要高度乘以 0.98 ,這里就相當(dāng)于減去 0.1

由于 easyx 坐標(biāo)上方為 y = 0,所以,應(yīng)該是:

y + (HEIGHT - y) * 0.1

再根據(jù)拋物線:y = x^2 ,修改一下就行了

else
{
	for (int a = 0; a < 360; a += 30)
	{
		for (int size = 5; size > 0; size--)
		{
			int x = cos(a * PI / 180.0) * (fire[i].explode + size * 10) + fire[i].nowx;
			int y = sin(a * PI / 180.0) * (fire[i].explode + size * 10) + fire[i].nowy + fire[i].radio / 2;
			int temp[] = { fire[i].rgb[0], fire[i].rgb[1], fire[i].rgb[2] };
			for (int k = 0; k < 3; k++)
			{
				temp[k] += 50 * (5 - size);
				if (temp[k] > 255) temp[k] = 255;
			}
			setfillcolor(RGB(temp[0], temp[1], temp[2]));
			solidcircle(x, y + (HEIGHT - y) * 0.1 + size * (size - 2), size);
		}
	}
}

效果展示

還挺好看的,不是嗎?

完整代碼

最后,把函數(shù)封裝一下,main 函數(shù)寫出來(lái)(有手就行!):

/*******************************
* 項(xiàng)目名稱:新年煙花
* 開發(fā)環(huán)境:vs2022 + Easyx
* 作者:軒
* 代碼長(zhǎng)度:137 行
* 完成時(shí)間:2023.1.20
* 用時(shí):2.2 小時(shí)
*******************************/
#include <graphics.h>
#include <math.h>
#include <time.h>
#include <stdio.h>
#define MAXNUM 15
#define WIDTH 640
#define HEIGHT 480
#define PI 3.1415926
struct Fire
{
	int nowx;
	int nowy;
	int endy;
	int radio;
	int explode;
	int rgb[3];
	COLORREF color;
}fire[MAXNUM];
void Init()
{
	for (int i = 0; i < MAXNUM; i++)
	{
		fire[i].nowx = rand() % WIDTH;
		fire[i].nowy = HEIGHT + rand() % 250 + 50;
		fire[i].endy = rand() % 100 + 10;
		fire[i].radio = rand() % 50 + 120;
		fire[i].explode = 0;
		int c[][3] = { {255, 0, 0}, {210, 190, 255}, {255, 120, 0}, {255, 0, 150}, {255, 240, 100}, {10, 255, 255}, {160, 10, 255}, {255, 200, 60} };
		int n = rand() % 8;
		fire[i].color = RGB(c[n][0], c[n][1], c[n][2]);
		fire[i].rgb[0] = c[n][0];
		fire[i].rgb[1] = c[n][1];
		fire[i].rgb[2] = c[n][2];
	}
}
void Draw()
{
	for (int i = 0; i < MAXNUM; i++)
	{
		if (fire[i].nowy > fire[i].endy)
		{
			for (int size = 5; size > 0; size--)
			{
				int temp[] = { fire[i].rgb[0], fire[i].rgb[1], fire[i].rgb[2] };
				for (int k = 0; k < 3; k++)
				{
					temp[k] += 50 * (5 - size);
					if (temp[k] > 255) temp[k] = 255;
				}
				setfillcolor(RGB(temp[0], temp[1], temp[2]));
				solidcircle(fire[i].nowx, fire[i].nowy + 15*(10 - size), size);
			}
		}
		else
		{
			for (int a = 0; a < 360; a += 30)
			{
				for (int size = 5; size > 0; size--)
				{
					int x = cos(a * PI / 180.0) * (fire[i].explode + size * 10) + fire[i].nowx;
					int y = sin(a * PI / 180.0) * (fire[i].explode + size * 10) + fire[i].nowy + fire[i].radio / 2;
					int temp[] = { fire[i].rgb[0], fire[i].rgb[1], fire[i].rgb[2] };
					for (int k = 0; k < 3; k++)
					{
						temp[k] += 50 * (5 - size);
						if (temp[k] > 255) temp[k] = 255;
					}
					setfillcolor(RGB(temp[0], temp[1], temp[2]));
					solidcircle(x, y + (HEIGHT - y) * 0.1 + size * (size - 2), size);
				}
			}
		}
	}
}
void Move()
{
	for (int i = 0; i < MAXNUM; i++)
	{
		if (fire[i].nowy > fire[i].endy)
		{
			fire[i].nowy -= 3;
		}
		else
		{
			if (fire[i].explode >= fire[i].radio)
			{
				fire[i].nowx = rand() % WIDTH;
				fire[i].nowy = HEIGHT + rand() % 250 + 50;
				fire[i].endy = rand() % 100 + 10;
				fire[i].radio = rand() % 50 + 120;
				fire[i].explode = 0;
				int c[][3] = { {255, 0, 0}, {210, 190, 255}, {255, 120, 0}, {255, 0, 150}, {255, 240, 100}, {10, 255, 255}, {160, 10, 255}, {255, 200, 60} };
				int n = rand() % 8;
				fire[i].color = RGB(c[n][0], c[n][1], c[n][2]);
				fire[i].rgb[0] = c[n][0];
				fire[i].rgb[1] = c[n][1];
				fire[i].rgb[2] = c[n][2];
			}
			else fire[i].explode++;
		}
	}
}
int main()
{
	srand(time(NULL));
	initgraph(640, 480);
	Init();
	BeginBatchDraw();
	while (true)
	{
		cleardevice();
		Draw();
		Move();
		FlushBatchDraw();
		Sleep(2);
	}
	EndBatchDraw();
	closegraph();
	return 0;
}

到此這篇關(guān)于C++實(shí)現(xiàn)動(dòng)態(tài)煙花代碼的文章就介紹到這了,更多相關(guān)C++煙花內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Qt+OpenCV利用幀差法實(shí)現(xiàn)車輛識(shí)別

    Qt+OpenCV利用幀差法實(shí)現(xiàn)車輛識(shí)別

    所謂幀差法也就是對(duì)連續(xù)圖像幀做差分運(yùn)算,其結(jié)果與定義好的閾值比較,若大于閾值則為運(yùn)動(dòng)目標(biāo)值為1,否則值為0?。本文將利用幀差法實(shí)現(xiàn)車輛識(shí)別,感興趣的可以了解一下
    2022-08-08
  • C語(yǔ)言的數(shù)字游戲算法效率問(wèn)題探討實(shí)例

    C語(yǔ)言的數(shù)字游戲算法效率問(wèn)題探討實(shí)例

    這篇文章主要介紹了C語(yǔ)言的數(shù)字游戲算法效率問(wèn)題探討實(shí)例,需要的朋友可以參考下
    2014-04-04
  • C++ 詳細(xì)講解對(duì)象的構(gòu)造順序

    C++ 詳細(xì)講解對(duì)象的構(gòu)造順序

    對(duì)象的構(gòu)造往往和構(gòu)造函數(shù)會(huì)牽扯在一起,構(gòu)造函數(shù)的函數(shù)可能會(huì)由非常復(fù)雜的邏輯所組成,不同類的構(gòu)造函數(shù)的程序邏輯很可能是相互依賴的,當(dāng)這種相互依賴一旦成立,那么對(duì)象的構(gòu)造順序很可能導(dǎo)致難以調(diào)試的Bug出現(xiàn)
    2022-04-04
  • C 語(yǔ)言restrict 關(guān)鍵字的使用淺談

    C 語(yǔ)言restrict 關(guān)鍵字的使用淺談

    C 語(yǔ)言restrict 關(guān)鍵字的使用淺談,需要的朋友可以參考一下
    2013-04-04
  • C語(yǔ)言入門篇--變量[定義,初始化賦值,外部聲明]

    C語(yǔ)言入門篇--變量[定義,初始化賦值,外部聲明]

    本篇文章是c語(yǔ)言基礎(chǔ)篇,本文對(duì)初識(shí)c語(yǔ)言的變量、變量的定義、初始化與賦值、變量的分類、含義、外部聲明做了簡(jiǎn)要的描述,幫助大家快速入門c語(yǔ)言的世界,更好的理解c語(yǔ)言
    2021-08-08
  • C++中typedef 及其與struct的結(jié)合使用

    C++中typedef 及其與struct的結(jié)合使用

    這篇文章主要介紹了C++中typedef 及其與struct的結(jié)合使用,需要的朋友可以參考下
    2014-02-02
  • C++函數(shù)模板與類模板相同與不同介紹

    C++函數(shù)模板與類模板相同與不同介紹

    C++語(yǔ)言的模板技術(shù)包括函數(shù)模板和類模板,模板技術(shù)是一種代碼重用技術(shù),函數(shù)和類是C++語(yǔ)言中兩種主要的重用代碼形式,這篇文章主要介紹了C++函數(shù)模板和類模板,需要的朋友可以參考下
    2022-08-08
  • C語(yǔ)言宏定義容易認(rèn)不清的盲區(qū)梳理

    C語(yǔ)言宏定義容易認(rèn)不清的盲區(qū)梳理

    宏定義是C提供的三種預(yù)處理(宏定義、文件包含、條件編譯)的其中一種,其主要目的是為程序員在編程時(shí)提供一定的方便,并能在一定程度上提高程序的運(yùn)行效率
    2022-09-09
  • C++實(shí)現(xiàn)彩色飛機(jī)大戰(zhàn)

    C++實(shí)現(xiàn)彩色飛機(jī)大戰(zhàn)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)彩色飛機(jī)大戰(zhàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • 聊聊C++中右值引用和移動(dòng)構(gòu)造函數(shù)的使用

    聊聊C++中右值引用和移動(dòng)構(gòu)造函數(shù)的使用

    這篇文章主要是來(lái)和大家一起聊聊C++中右值引用和移動(dòng)構(gòu)造函數(shù)的使用,文中通過(guò)示例進(jìn)行了詳細(xì)講解,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-07-07

最新評(píng)論

石门县| 建瓯市| 无锡市| 仪征市| 广平县| 理塘县| 买车| 普兰县| 沙洋县| 陈巴尔虎旗| 五寨县| 汉阴县| 阜宁县| 张家港市| 兰考县| 布尔津县| 濉溪县| 黔江区| 库伦旗| 赣榆县| 扶风县| 大安市| 搜索| 哈尔滨市| 惠来县| 黑水县| 朔州市| 余姚市| 油尖旺区| 太仆寺旗| 三河市| 阿拉善左旗| 平泉县| SHOW| 军事| 华蓥市| 余庆县| 铜山县| 惠水县| 肇源县| 阿克|