系列文章
序号 | 直达链接 |
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);
}
}
}
……
代码分析
功能概述
该程序实现了一个星空动态背景效果,包含随机生成的星星和流星动画,同时配有背景音乐。整个场景渲染在1500×1000像素的图形窗口中,通过持续更新画面形成流畅的动画效果。
核心设计逻辑
程序采用结构化设计,将不同的功能模块封装为独立函数。主循环负责协调各模块的执行顺序,通过双缓冲技术避免画面闪烁。动态元素包括星星和流星分别使用结构体数组管理其属性,每帧更新位置后重新绘制。
图形元素实现
星星采用随机生成的小圆形表示,颜色、位置和移动速度均为随机值。当星星移出右边界时,会被重新初始化到左侧。流星使用外部加载的图片素材,两种不同样式随机选择,呈现斜向移动轨迹。流星移出视窗后同样会重置位置。
性能优化措施
通过MAXSTAR和MAXMETEOR宏控制粒子数量上限,平衡视觉效果与性能消耗。BeginBatchDraw和EndBatchDraw配对调用实现批量绘制,减少频繁刷新带来的性能开销。Sleep(10)控制帧率约100FPS,避免CPU占用过高。
多媒体集成
采用Windows多媒体接口播放循环背景音乐,音乐文件需与程序同目录。图形窗口初始化为最大化状态,确保显示区域完整。加载的图片素材包括背景图和流星贴图,要求特定文件名存在于运行目录。
随机化处理
系统时间作为随机种子,确保每次运行产生不同的星空分布。流星和星星的各项参数均在合理范围内随机生成,包括速度值域、初始位置偏移、颜色组合等,增强视觉效果的自然感。
异常处理机制
程序缺少显式的错误检测机制,依赖外部文件必须存在且路径正确。图形窗口关闭时直接退出程序,未做资源释放的异常处理。音乐播放指令未包含状态检查,假设音频设备可用。
扩展性分析
结构体设计便于新增粒子属性,如星星大小可变或流星拖尾效果。MAXSTAR常量调整可适应不同硬件性能。缺少用户交互接口,可扩展鼠标点击添加特殊效果等功能。未使用面向对象设计,增加新元素类型需修改多处代码。
视觉表现特点
星空背景产生无限循环的平移效果,模拟宇宙视角移动。流星出现位置经过负坐标偏移处理,确保进入视窗时的自然感。两种流星样式交替出现增加视觉多样性,速度差异形成层次感。RGB随机配色使星星呈现彩色闪烁效果。
改进建议
增加资源加载失败时的默认替代方案。引入粒子系统管理类优化代码结构。添加暂停/继续功能键控制动画。实现窗口大小自适应调整。加入更多流星路径算法模拟不同坠落角度。使用纹理替代纯色圆点增强星星细节。
写在后面
我是一只有趣的兔子,感谢你的喜欢!