欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 新车 > C/C++流星雨

C/C++流星雨

2025/2/21 3:43:16 来源:https://blog.csdn.net/m0_68111267/article/details/145714225  浏览:    关键词:C/C++流星雨

 

系列文章

序号直达链接
1C/C++李峋同款跳动的爱心
2C/C++跳动的爱心
3C/C++经典爱心
4C/C++满屏飘字
5C/C++大雪纷飞
6C/C++炫酷烟花
7C/C++黑客帝国同款字母雨
8C/C++樱花树
9C/C++奥特曼
10C/C++精美圣诞树
11C/C++俄罗斯方块小游戏
12C/C++贪吃蛇小游戏
13C/C++孤单又灿烂的神
14C/C++闪烁的爱心
15C/C++哆啦A梦
16C/C++简单圣诞树
17C/C++小宇宙
18C/C++冰墩墩
19C/C++七彩花朵
20C/C++玫瑰花
21C/C++小猪佩奇
22C/C++简易爱心
23C/C++流星雨
24C/C++2048小游戏
25C/C++爱心圣诞树
26C/C++文字跑马灯
27C/C++教师工作量管理系统
28C/C++满天繁星
29C/C++漂浮爱心
30C/C++五子棋小游戏
31C/C++球球大作战小游戏
32C/C++走迷宫小游戏
33C/C++粉色爱心
34C/C++跨年烟花
35C/C++棕色小熊
36C/C++粉色动态爱心
37C/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 100class 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 图形库,实现了一个 高效、流畅的流星雨动画。它采用 批量绘制 提升性能,并使用 随机参数 让动画更具变化性。可以进一步优化 视觉细节,增强沉浸感。

写在后面

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词