系列文章
序号 | 直达链接 |
1 | C/C++爱心代码 |
2 | C/C++跳动的爱心 |
3 | C/C++李峋同款跳动的爱心代码 |
4 | C/C++满屏飘字表白代码 |
5 | C/C++大雪纷飞代码 |
6 | C/C++烟花代码 |
7 | C/C++黑客帝国同款字母雨 |
8 | C/C++樱花树代码 |
9 | C/C++奥特曼代码 |
10 | C/C++精美圣诞树 |
11 | C/C++俄罗斯方块 |
12 | C/C++贪吃蛇 |
13 | C/C++孤单又灿烂的神-鬼怪 |
14 | C/C++闪烁的爱心 |
15 | C/C++哆啦A梦 |
16 | C/C++简单圣诞树 |
17 | C/C++小宇宙 |
18 | C/C++冰墩墩 |
19 | C/C++七彩花朵 |
20 | C/C++玫瑰花 |
21 | C/C++小猪佩奇 |
22 | C/C++简易爱心 |
写在前面
C/C++语言实现流星雨动态效果的完整代码。
完整代码
#include <stdio.h>#include <graphics.h> #include <conio.h>#include <math.h>#include <Windows.h>#include <time.h>#include <mmsystem.h>#pragma comment(lib, "winmm.lib")#define PI 3.1415926535897932384624#define MAXSTAR 300 // 限制星星数量,减少性能消耗#define MAXMETEOR 199 // 流星数量// 定义图片变量IMAGE img1, img2, background;// 星星结构体struct Star{ int x, y; int speed; int color;} star[MAXSTAR];// 流星结构体struct Meteor{ int x, y; int speed; int style;} meteor[MAXMETEOR];// 初始化星星void initStar(int i){ star[i].x = rand() % 1500; star[i].y = rand() % 1000; star[i].speed = rand() % 8 + 1; star[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);}// 绘制并移动星星void drawAndMoveStar(int i){ setfillcolor(star[i].color); solidcircle(star[i].x, star[i].y, 2); // 绘制小圆作为星星 star[i].x += star[i].speed; if (star[i].x > 1500) { initStar(i); // 重新初始化超出边界的星星 }}// 初始化流星void initMeteor(int i){ meteor[i].x = rand() % 2200 - 1200; meteor[i].y = -400; meteor[i].speed = rand() % 15 + 5; // 速度范围 [5,19] meteor[i].style = rand() % 2; // [0,1]}// 更新并绘制流星void updateAndDrawMeteor(){ for (int i = 0; i < MAXMETEOR; i++) { // 移动流星 meteor[i].x = meteor[i].x + meteor[i].speed / 2; meteor[i].y = meteor[i].y + meteor[i].speed / 2; // 绘制流星 if (meteor[i].style == 0) { putimage(meteor[i].x, meteor[i].y, &img1, SRCPAINT); } else { putimage(meteor[i].x, meteor[i].y, &img2, SRCPAINT); } // 流星超出边界重新初始化 if (meteor[i].x > 1500 || meteor[i].y > 1000) { initMeteor(i); } }}// 主函数int main(){ // 加载图片 loadimage(&img1, "1.jpg", 50, 50); loadimage(&img2, "2.jpg", 50, 50); loadimage(&background, "background.jpg", 1500, 1000); srand((unsigned int)time(NULL)); // 创建图形窗口 HWND hwnd = initgraph(1500, 1000); ShowWindow(hwnd, 3); // 播放背景音乐 mciSendString("open 小幸运.mp3 alias MM", 0, 0, 0); mciSendString("play MM repeat", 0, 0, 0); // 初始化星星和流星 for (int i = 0; i < MAXSTAR; i++) { initStar(i); } for (int i = 0; i < MAXMETEOR; i++) { initMeteor(i); } // 主绘图循环 while (1) { BeginBatchDraw(); // 绘制背景 putimage(0, 0, &background); // 绘制并移动星星 for (int i = 0; i < MAXSTAR; i++) { drawAndMoveStar(i); } // 更新并绘制流星 updateAndDrawMeteor(); EndBatchDraw(); // 控制帧率 Sleep(10); } _getch(); closegraph(); return 0;}
代码分析
这段代码是一个使用 EasyX 图形库编写的 C++ 程序,它创建了一个模拟星空效果的图形窗口。程序中包含了星星和流星的动画效果,并且背景音乐在循环播放。下面是对这段代码的详细分析。
包含的头文件
graphics.h
:EasyX 库的图形函数。conio.h
:提供控制台输入输出功能,如 _getch()
用于等待按键输入。math.h
:数学运算函数。Windows.h
和 mmsystem.h
:Windows API 头文件,以及多媒体支持。 宏定义
PI
:圆周率的值。MAXSTAR
:设定最大星星数量为300个,以限制性能消耗。MAXMETEOR
:设定最大流星数量为199个。 结构体定义
Star
:表示一个星星,包含位置(x, y)、速度(speed)和颜色(color)。Meteor
:表示一个流星,包含位置(x, y)、速度(speed)和样式(style),其中样式决定了使用哪个图片作为流星图像。 函数定义
initStar(int i)
:初始化第i颗星星的位置、速度和颜色。drawAndMoveStar(int i)
:绘制第i颗星星并更新其位置;如果星星移出了屏幕,则重新初始化。initMeteor(int i)
:初始化第i颗流星的位置、速度和样式。updateAndDrawMeteor()
:更新所有流星的位置,并根据它们的样式绘制相应的图片;如果流星移出了屏幕,则重新初始化。 主函数 main()
加载了三张图片资源,分别用作两种不同样式的流星图像 (img1
, img2
) 和背景图像 (background
)。使用当前时间来播种随机数生成器 (srand((unsigned int)time(NULL))
),确保每次运行时星星和流星的初始状态都是不同的。创建了一个1500x1000像素的图形窗口,并显示出来。打开并循环播放名为“小幸运.mp3”的背景音乐。初始化所有星星和流星的状态。进入主绘图循环,持续不断地绘制背景、移动和绘制星星及流星,直到用户关闭程序。在主循环内使用 BeginBatchDraw()
和 EndBatchDraw()
来批量处理绘图命令,提高效率。控制帧率为大约每秒100帧(通过 Sleep(10)
实现)。最后,在用户按键之前保持图形窗口打开,并在结束时清理图形环境。 请注意,为了正确运行这段代码,你需要有 EasyX 图形库的开发环境配置好,并且需要准备对应的图片文件和音频文件。此外,由于这个程序是无限循环的,通常应该有一个退出条件或事件监听机制,例如检测用户的关闭窗口操作或者特定键的按下,以便能够优雅地退出程序。
写在后面
我是一只有趣的兔子,感谢你的喜欢!