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 图形库,实现了一个 高效、流畅的流星雨动画。它采用 批量绘制 提升性能,并使用 随机参数 让动画更具变化性。可以进一步优化 视觉细节,增强沉浸感。

写在后面

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/24381.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

理解 MHA、GQA、MQA 和 MLA:多头注意力的变种及其应用

在深度学习、自然语言处理&#xff08;NLP&#xff09;和计算机视觉&#xff08;CV&#xff09;中&#xff0c;多头注意力&#xff08;Multi-Head Attention, MHA&#xff09;是 Transformer 结构的核心。近年来&#xff0c;MHA 产生了多个变体&#xff0c;如 GQA&#xff08;G…

Crack SmartGit

感谢大佬提供的资源 一、正常安装SmartGit 二、下载crackSmartGit crackSmartGit 发行版 - Gitee.com 三、使用crackSmartGit 1. 打开用户目录&#xff1a;C:\Users%用户名%\AppData\Roaming\syntevo\SmartGit。将crackSmartGit.jar和license.zip拷贝至 用户目录。 2. 用户…

将CUBE或3DL LUT转换为PNG图像

概述 在大部分情况下&#xff0c;LUT 文件通常为 CUBE 或 3DL 格式。但是我们在 OpenGL Shader 中使用的LUT&#xff0c;通常是图像格式的 LUT 文件。下面&#xff0c;我将教大家如何将这些文件转换为 PNG 图像格式。 条形LUT在线转换&#xff08;不是8x8网络&#xff09;&am…

关于命令行下的 git( git add、git commit、git push)

文章目录 关于 gitgit 的概念git 操作&#xff08;git add、git commit、git push 三板斧&#xff09;安装 git新建仓库及配置git clone.gitignoregit addgit commitgit push其他 git 指令git pull&#xff08;把远端的东西拉到本地进行同步&#xff09;其他指令 关于 git git…

一文讲解Redis中的数据一致性问题

一文讲解Redis中的数据一致性问题 在技术派实战项目中&#xff0c;我们采用的是先写 MySQL&#xff0c;再删除 Redis 的方式来保证缓存和数据库的数据一致性。 我举例说明一下。 对于第一次查询&#xff0c;请求 B 查询到的缓存数据是 10&#xff0c;但 MySQL 被请求 A 更新为…

论文笔记(七十二)Reward Centering(五)

Reward Centering&#xff08;五&#xff09; 文章概括摘要附录B 理论细节C 实验细节D 相关方法的联系 文章概括 引用&#xff1a; article{naik2024reward,title{Reward Centering},author{Naik, Abhishek and Wan, Yi and Tomar, Manan and Sutton, Richard S},journal{arX…

使用 Python 进行批量解压 .rar 文件

在进行解压 .rar 文件之前&#xff0c;需要进行下载外部工具包&#xff0c;参考以下地址&#xff1a; WinRAR archiver, a powerful tool to process RAR and ZIP filesWinRAR is a Windows data compression tool that focuses on the RAR and ZIP data compression formats …

夜莺监控 - 边缘告警引擎架构详解

前言 夜莺类似 Grafana 可以接入多个数据源&#xff0c;查询数据源的数据做告警和展示。但是有些数据源所在的机房和中心机房之间网络链路不好&#xff0c;如果由 n9e 进程去周期性查询数据并判定告警&#xff0c;那在网络链路抖动或拥塞的时候&#xff0c;告警就不稳定了。所…

Apache DolphinScheduler系列1-单节点部署及测试报告

文章目录 整体说明一、部署环境二、版本号三、部署方案四、部署步骤4.1、上传部署包4.2、创建外部数据库4.3、修改元数据库配置4.4、上传MySQLl驱动程序4.5、初始化外部数据库4.6、启停服务4.7、访问页面五、常见问题及解决方式5.1、时间不一致5.2、异常终止5.3、大量日志5.4、…

CNN 卷积神经网络

前置基础知识 convolution operator 卷积运算 输入矩阵循环取子矩阵跟filter(kernal)按位乘后加和作为输出矩阵对应位置的值。 convolution与cross correlation 上面操作实际是cross correlation操作&#xff0c;两者之间的唯一区别是卷积操作需要在开始计算之前将卷积核进行…

docker部署go简单web项目(无mysql等附加功能)

首先准备好go语言代码 代码表示当访问主机上8080端口下的/hello路径时&#xff0c;会返回hello&#xff0c;world。 package mainimport ("fmt""github.com/gin-gonic/gin" )type hh struct {S string }func main() {router : gin.Default()router.GET(&…

C语言:字符函数和字符串函数

1.字符函数 在 C 语言中&#xff0c;字符分类函数主要定义在<ctype.h>头文件中&#xff0c;这些函数可以用来判断一个字符是否属于特定的字符类别&#xff0c;下面为你详细介绍一些常用的字符分类函数&#xff1a; 1.1 iscntrl 功能&#xff1a;判断一个字符是否为控制…

全域旅游景区导览系统:赋能智慧旅游生态,破解行业核心难题

全域旅游景区导览系统&#xff1a;赋能智慧旅游生态&#xff0c;破解行业核心难题 ——整合旅游商城、非遗文化与全域服务的一站式解决方案 一、行业痛点&#xff1a;传统旅游服务模式的局限性 随着旅游业从单一景区游览向“全域旅游”转型&#xff0c;传统服务模式暴露出诸多…

SQL笔记#集合运算

目录 一、表的加减法 1、什么是集合运算 2、表的加法——UNION 3、集合运算的注意事项 4、包含重复行的集合运算——ALL运算 5、选取表中公共部分——INTERSECT 6、记录的减法——EXCEPT 二、联结(以列为单位对表进行联结) 1、什么是联结(JOIN) 2、内联结——INSER…

基于C++“简单且有效”的“数据库连接池”

前言 数据库连接池在开发中应该是很常用的一个组件&#xff0c;他可以很好的节省连接数据库的时间开销&#xff1b;本文基使用C实现了一个简单的数据库连接池&#xff0c;代码量只有400行只有&#xff0c;但是压力测试效果很好&#xff1b;欢迎收藏 关注&#xff0c;本人将会…

如何通过提示词更好地利用AI

如何通过提示词工程释放AI的全部潜力&#xff1a;7个深度优化技巧 前言&#xff1a;为什么提示词决定AI的输出质量&#xff1f; 在人工智能对话系统的使用中&#xff0c;提示词&#xff08;Prompt&#xff09;就像开启宝藏的密码钥匙。研究表明&#xff0c;优化后的提示词可使…

【C语言】指针笔试题

前言&#xff1a;上期我们介绍了sizeof与strlen的辨析以及sizeof&#xff0c;strlen相关的一些笔试题&#xff0c;这期我们主要来讲指针运算相关的一些笔试题&#xff0c;以此来巩固我们之前所学的指针运算&#xff01; 文章目录 一&#xff0c;指针笔试题1&#xff0c;题目一…

电子科技大学考研复习经验分享

电子科技大学考研复习经验分享 本人情况&#xff1a;本科就读于电科软院&#xff0c;24年2月开始了解考研&#xff0c;24年3月开始数学&#xff0c;9月决定考本院&#xff08;开始全天候图书馆学习&#xff09;并开始专业课学习&#xff0c;11月底开始政治学习&#xff0c;最后…

c#笔记-基础知识

目录 整数 浮点 decimal bool 引用 object string 值 枚举 关键字 enum 类型转换 隐式转换 ​编辑 显式转换 装箱&#xff0c;拆箱 常量 表达式 ​编辑 字符串的使用 比较字符串 字符格式化 ​编辑 截取字符串 字符串的分割 插入字符串 删除字符串 …

表单制作代码,登录动画背景前端模板

炫酷动效登录页 引言 在网页设计中,按钮是用户交互的重要元素之一。一个炫酷的按钮特效不仅能提升用户体验,还能为网页增添独特的视觉吸引力。今天,我们将通过CSS来实现一个“表单制作代码,登录动画背景前端模板”。该素材呈现了数据符号排版显示出人形的动画效果,新颖有…