C/C++流星雨

发布于:2025-02-20 ⋅ 阅读:(40) ⋅ 点赞:(0)

 

系列文章

序号 直达链接
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++简易爱心
23 C/C++流星雨
24 C/C++2048小游戏
25 C/C++爱心圣诞树
26 C/C++文字跑马灯
27 C/C++教师工作量管理系统
28 C/C++满天繁星
29 C/C++漂浮爱心
30 C/C++五子棋小游戏
31 C/C++球球大作战小游戏
32 C/C++走迷宫小游戏
33 C/C++粉色爱心
34 C/C++跨年烟花
35 C/C++棕色小熊
36 C/C++粉色动态爱心
37 C/C++新春烟花
敬请期待……

写在前面

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

技术需求

  1. EasyX 图形库:用于图形绘制和窗口管理。它简化了图形编程,使得开发者能够轻松实现动画和图形界面。

  2. 面向对象编程(OOP):通过定义 Meteor 类,采用面向对象的方式模拟流星的行为,使得代码结构更加清晰、可扩展。

  3. 随机数生成:使用 rand() 函数生成流星的随机位置、速度、长度和颜色,增强了动画的多样性和随机性。

  4. 三角函数:利用 cos()sin() 函数计算流星的运动轨迹(以30度角为方向),模拟流星的自然运动。

  5. 批量绘制:通过 BeginBatchDraw()EndBatchDraw() 函数来批量绘制流星,减少屏幕刷新次数,提升绘图效率,避免动画卡顿。

  6. 异步键盘输入:使用 GetAsyncKeyState() 检测用户按下 ESC 键,实现退出动画的功能。

  7. 时间控制:通过 Sleep(20) 控制动画的帧率,使得流星的移动速度适中,并避免程序过快运行导致动画效果不自然。

环境搭建

环境:C/C++

软件:Visual Studio 2022

安装教程:C语言环境搭建教程(Visual Studio)

1. EasyX是什么

EasyX是一个专为C++初学者和爱好者设计的图形库。该库以简洁易用、功能实用为宗旨,通过封装Windows GDI接口,极大降低了C++编程中图形界面设计的复杂度,使得用户能够快速上手并实现各类图形图像处理任务。

EasyX提供了一系列丰富的API函数,涵盖了绘制基本图形(如线段、圆形、矩形等)、填充图形、显示文本、加载与保存图片、颜色设置以及鼠标键盘事件处理等功能。通过简单的函数调用,开发者可以高效地进行2D图形绘制和交互式程序设计。

总的来说,EasyX以其友好的学习曲线和高效的图形处理能力,极大地激发了C++初学者对计算机图形学的兴趣,是广大编程入门者和教育领域广泛采用的一款图形库工具。

2. 下载安装EasyX

1.进入EasyX官网,点击下载按钮开始下载

2.下载完成后进入下载目录,双击.exe文件无脑安装即可

完整代码

#include <graphics.h>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <cmath>

#define SCREEN_WIDTH 1000
#define SCREEN_HEIGHT 600
#define METEOR_COUNT 100

class Meteor {
public:
    int x, y, length, speed;
    COLORREF color;
    static constexpr double angle = 30.0 * 3.14159265 / 180.0; // 30度角转换为弧度

    Meteor() {
        reset();
    }

    void reset() {
        length = rand() % 50 + 10;
        speed = rand() % 20 + 10;
        x = -rand() % SCREEN_WIDTH;
        y = -rand() % SCREEN_HEIGHT;
        color = RGB(rand() % 156 + 100, rand() % 156 + 100, 255); // 蓝色调
    }

    void move() {
        x += static_cast<int>(speed * cos(angle));
        y += static_cast<int>(speed * sin(angle));
        if (y > SCREEN_HEIGHT || x > SCREEN_WIDTH) {
            reset();
        }
    }

    void draw() const {
        setlinecolor(color);
        setlinestyle(PS_SOLID, 2);
        line(x, y, x - static_cast<int>(length * cos(angle)), y - static_cast<int>(length * sin(angle)));
    }
};

……

代码分析

这段 C++ 代码使用 EasyX 图形库创建了一个简单的流星雨动画。代码的核心思想是模拟多个流星从屏幕的左上角向右下角滑落,并不断重复这一过程,以达到持续降落的视觉效果。下面,我们对代码进行详细分析,包括 功能解析关键技术点运行机制 以及 优化建议


1. 代码功能概述

这段代码的主要功能是:

  1. 1000×600 的窗口中绘制 100 颗流星,并使其不断从屏幕左侧或顶部滑落到右下角。
  2. 每颗流星都有不同的 颜色长度速度,增加视觉层次感。
  3. 当流星超出屏幕边界后,会被重置到初始位置,从而模拟持续的流星雨效果。
  4. 允许用户按下 ESC 键 退出动画。

2. 代码结构与解析

代码主要由以下几个部分组成:

(1) 头文件引用

  • #include <graphics.h>:引入 EasyX 图形库,用于绘制流星动画。
  • #include <vector>:使用 C++ STL vector 来存储 100 颗流星
  • #include <cstdlib>#include <ctime>:用于 随机数生成,控制流星的随机位置、长度和速度。
  • #include <cmath>:用于计算 流星的运动角度

(2) 宏定义

  • 设定 屏幕宽度高度1000×600 像素。
  • 定义 流星的总数100

3. Meteor 类分析

  • x, y:流星的起始坐标。
  • length:流星的长度,范围 [10, 60]
  • speed:流星的速度,范围 [10, 30]
  • color:流星的颜色,随机生成蓝色调。
  • angle = 30°:流星的运动方向固定为 30° 角。

(1) reset() 方法——初始化流星

  • 长度 length 设定为 10~60 像素,增强流星视觉多样性。
  • 速度 speed 设定为 10~30,使流星落地时间不同,避免单调。
  • 起始位置 (x, y) 设置为负数,确保流星从 屏幕外 进入视野。
  • 颜色 color 设定为蓝色 (RGB(R, G, 255)),使流星带有夜空的冷色调。

(2) move() 方法——更新流星位置

  • 计算流星移动方向
    • x 方向移动速度 = speed * cos(30°)
    • y 方向移动速度 = speed * sin(30°)
  • 当流星越界x > SCREEN_WIDTHy > SCREEN_HEIGHT),重置流星到屏幕外。

(3) draw() 方法——绘制流星

  • setlinecolor(color) 设置流星颜色。
  • setlinestyle(PS_SOLID, 2) 设定 实线,宽度为 2 像素。
  • line(x, y, x - length * cos(angle), y - length * sin(angle)) 画出 倾斜 30° 的流星轨迹

4. runMeteorShower() 方法解析

(1) 初始化图形窗口

  • 创建 1000×600 像素窗口。
  • 设置背景色为 黑色,模拟夜空。

(2) 主循环

  • BeginBatchDraw()EndBatchDraw() 提高 绘图效率,避免屏幕闪烁。
  • cleardevice() 清空屏幕,防止流星残影。
  • for 循环遍历 100 颗流星,调用 move()draw() 方法。
  • Sleep(20) 让程序 每帧等待 20ms,控制流星动画速度。
  • GetAsyncKeyState(VK_ESCAPE) 监听 ESC 键 退出程序。

5. main() 函数解析

  • srand(time(0)) 生成随机数种子,使流星属性每次运行时都不同。
  • 调用 runMeteorShower() 运行 流星雨动画

6. 总结

本代码通过 面向对象设计,结合 EasyX 图形库,实现了一个 高效、流畅的流星雨动画。它采用 批量绘制 提升性能,并使用 随机参数 让动画更具变化性。可以进一步优化 视觉细节,增强沉浸感。

写在后面

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