<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
首先,祝大家新年快樂!
即將迎來新的一年——癸卯兔年,祝大家成績、事業“兔”飛猛進,必定紅紅火火!
在這篇文章中,將用煙花致以大家最好的祝福!
煙花程式碼將會用到 Easyx 圖形庫,可以去官網下載:easyx.cn
1 煙花結構體
2 初始化煙花
3 煙花上升
4 煙花爆炸
5 繪製煙花
不需要任何圖片、音效(本來想加的,你要加自己加吧)
提前宣告:程式碼純原創!
需要用到的標頭檔案以及宏:
#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圖形庫
math.h 計算煙花位置
time.h 選取隨機種子
stdio.h 標準輸入輸出標頭檔案
MAXNUM 煙花數量
WIDTH , HEIGHT 視窗的寬、高
PI 圓周率常數,結合數學庫計算煙花位置
定義的引數如下:
nowx , nowy 現在座標
endy 爆炸高度
radio 爆炸半徑
explode 爆炸進度
rgb[3] 煙花顏色rgb值
color 煙花顏色
struct Fire { int nowx; int nowy; int endy; int radio; int explode; int rgb[3]; COLORREF color; }fire[MAXNUM];
nowx , nowy 視窗外的隨機位置
endy 隨即高度
radio 隨即半徑
explode 一開始設為0
rgb[3] 一些特定的顏色隨機取
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]; } }
y座標 還沒到達爆炸高度時一直上升
for (int i = 0; i < MAXNUM; i++) { if (fire[i].nowy > fire[i].endy) { fire[i].nowy -= 3; } }
爆炸進度 explode 不斷增加,如果到達爆炸半徑,就重新初始化。(接上面的if語句)
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個圓,大小從大到小,顏色從深到淺(增加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); } } }
爆炸
重頭戲!重頭戲!重頭戲!需要一些簡(fù)單(zá)的數(gāo)學(děng)常(shù)識(xúe)!
顏色漸變的實現方式跟前面一樣,只不過這裡要用三角函數計算座標,再用萬有引力、拋物線等改變 y座標,讓它看得更真實!(牛頓:算你小子識相)
具體如何計算座標,看我的文章,裡面有說如何計算
然後是萬有引力,大概需要高度乘以 0.98 ,這裡就相當於減去 0.1
由於 easyx 座標上方為 y = 0,所以,應該是:
y + (HEIGHT - y) * 0.1
再根據拋物線: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); } } }
還挺好看的,不是嗎?
最後,把函數封裝一下,main 函數寫出來(有手就行!):
/******************************* * 專案名稱:新年煙花 * 開發環境:vs2022 + Easyx * 作者:軒 * 程式碼長度:137 行 * 完成時間:2023.1.20 * 用時:2.2 小時 *******************************/ #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; }
到此這篇關於C++實現動態煙花程式碼的文章就介紹到這了,更多相關C++煙花內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45