C/C++流星雨

发布于:2025-05-23 ⋅ 阅读:(12) ⋅ 点赞:(0)

流星雨

写在前面

C/C++语言实现流星雨动态效果的完整代码。

系列文章

技术需求

  1. 图形绘制技术

    • 使用 EasyX 图形库实现图形窗口的创建、图片加载与显示、图形绘制(如星星的圆形)等操作。
    • 主要函数包括:initgraphputimagesolidcirclesetfillcolor 等。
  2. 随机数生成技术

    • 使用 rand() 函数生成随机数,控制星星和流星的位置、速度、颜色及样式,增加动画的随机性和动态效果。
  3. 动画实现技术

    • 通过循环更新星星和流星的坐标,实现动态移动效果。
    • 使用批量绘图函数 BeginBatchDrawEndBatchDraw 提高绘图效率,减少屏幕闪烁。
    • 控制帧率:通过 Sleep(10) 设置延迟时间,平滑动画效果。
  4. 多媒体播放技术

    • 使用 Windows 多媒体接口 mciSendString 实现背景音乐的加载与循环播放。
  5. 数据结构与结构体

    • 使用结构体 StarMeteor 分别存储星星和流星的属性,如坐标、速度和样式,方便管理和更新。
  6. 资源加载与管理

    • 加载外部图片资源(1.jpg2.jpgbackground.jpg)作为动画元素,提升视觉效果。
  7. 性能优化技术

    • 限制星星和流星的数量,减少计算与绘图开销。
    • 使用批量绘图技术确保动画流畅运行。

完整代码

#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); // 重新初始化超出边界的星星
    }
}
……

代码分析

以下是对这段C语言代码的详细分析,内容包括程序功能、逻辑结构、各部分代码的功能解释、图形库的使用,以及关键函数和数据结构的作用分析。


1. 代码功能概述

本程序通过使用 C 语言结合图形库(EasyX),实现了一个流星与星星动画效果,背景中播放音乐。主要功能如下:

  1. 背景设置:加载一张背景图片作为画布。
  2. 星星动画:绘制多颗不同颜色的星星,并使它们以不同速度从左向右移动,当超出边界时重新出现。
  3. 流星动画:动态生成多颗流星,以一定速度沿对角线方向移动,且有两种不同的样式。
  4. 背景音乐播放:通过 Windows 多媒体接口播放一首背景音乐,并设置为循环播放。
  5. 性能优化:通过批量绘图(BeginBatchDraw/EndBatchDraw)和减少星星与流星数量,确保程序运行流畅。

2. 代码结构分析

1. 头文件与宏定义

#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")
  • graphics.h:EasyX 图形库的头文件,用于图形绘制。
  • math.h:用于数学运算(未直接使用)。
  • Windows.h:用于调用 Windows API。
  • time.h:用于随机数种子初始化。
  • mmsystem.h:多媒体头文件,用于播放音乐。
  • 宏定义
    #define PI 3.1415926535897932384624
    #define MAXSTAR 300  // 限制星星数量
    #define MAXMETEOR 199 // 流星数量
    
    • 定义了圆周率 PI,虽然代码未使用。
    • 定义了星星与流星的最大数量,限制了程序性能开销。

2. 数据结构

struct Star
{
    int x, y;      // 星星的坐标
    int speed;     // 星星的移动速度
    int color;     // 星星的颜色
} star[MAXSTAR];
  • Star 结构体用于存储每颗星星的属性:
    • x, y:坐标位置。
    • speed:移动速度。
    • color:颜色,RGB 格式。
struct Meteor
{
    int x, y;      // 流星的坐标
    int speed;     // 流星的移动速度
    int style;     // 流星的样式
} meteor[MAXMETEOR];
  • Meteor 结构体用于存储每颗流星的属性:
    • x, y:坐标位置。
    • speed:移动速度。
    • style:流星样式(0 或 1)。

3. 星星初始化与移动

函数:initStar(int i)

void initStar(int i)
{
    star[i].x = rand() % 1500;            // 随机横坐标
    star[i].y = rand() % 1000;            // 随机纵坐标
    star[i].speed = rand() % 8 + 1;       // 速度范围 [1,8]
    star[i].color = RGB(rand() % 256, rand() % 256, rand() % 256); // 随机颜色
}
  • 初始化星星的初始位置、速度和颜色,保证每颗星星的属性都随机。

函数:drawAndMoveStar(int i)

void drawAndMoveStar(int i)
{
    setfillcolor(star[i].color);         // 设置填充颜色
    solidcircle(star[i].x, star[i].y, 2); // 绘制半径为 2 的小圆
    star[i].x += star[i].speed;          // 星星向右移动
    if (star[i].x > 1500)                // 超出边界
    {
        initStar(i);                     // 重新初始化
    }
}
  • 功能
    • 使用 solidcircle 绘制小圆表示星星。
    • 星星向右移动,若超出边界则重新初始化。

4. 流星初始化与更新

函数:initMeteor(int i)

void initMeteor(int i)
{
    meteor[i].x = rand() % 2200 - 1200; // 横坐标范围 [-1200, 1000]
    meteor[i].y = -400;                // 初始纵坐标在画布上方
    meteor[i].speed = rand() % 15 + 5; // 速度范围 [5,19]
    meteor[i].style = rand() % 2;      // 样式:0 或 1
}
  • 将流星随机放置在画布外的上方区域,并赋予速度和样式。

函数:updateAndDrawMeteor()

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);
        }
    }
}
  • 功能
    • 流星沿对角线移动(x 和 y 同时增加)。
    • 使用 putimage 显示流星图片。
    • 如果流星超出边界,重新初始化位置。

5. 主函数

功能概述

  1. 加载资源:加载背景图片和流星图片。
  2. 播放背景音乐:通过 mciSendString 调用 Windows 多媒体接口播放音乐。
  3. 初始化:初始化星星和流星。
  4. 主循环
    • 批量绘图,先清除画面再绘制背景、星星与流星。
    • 控制帧率以保证动画流畅。

3. 总结

  1. 图形动态效果:通过 EasyX 图形库实现星星和流星的动态效果,利用随机数保证多样性。
  2. 资源加载与音乐播放:合理使用图片和音频资源,增加程序的视觉与听觉体验。
  3. 性能优化:通过控制星星与流星数量,以及批量绘图方式,确保了流畅运行。
  4. 可扩展性:程序框架清晰,可以方便地增加更多动画元素或修改效果。

此代码展示了 C 语言在图形编程方面的应用,同时结合了多媒体功能,是一个完整的图形动画程序。

写在后面

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


网站公告

今日签到

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