C/C++流星雨

发布于:2025-06-23 ⋅ 阅读:(11) ⋅ 点赞:(0)

流星雨

系列文章

写在前面

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随机配色使星星呈现彩色闪烁效果。

改进建议

增加资源加载失败时的默认替代方案。引入粒子系统管理类优化代码结构。添加暂停/继续功能键控制动画。实现窗口大小自适应调整。加入更多流星路径算法模拟不同坠落角度。使用纹理替代纯色圆点增强星星细节。

写在后面

我是一只有趣的兔子,感谢你的喜欢!


网站公告

今日签到

点亮在社区的每一天
去签到