主页 > 创业  > 

C/C++流星雨

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++语言实现流星雨动画的完整代码。

技术需求

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

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

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

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

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

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

时间控制:通过 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. 代码功能概述

这段代码的主要功能是:

在 1000×600 的窗口中绘制 100 颗流星,并使其不断从屏幕左侧或顶部滑落到右下角。每颗流星都有不同的 颜色、长度 和 速度,增加视觉层次感。当流星超出屏幕边界后,会被重置到初始位置,从而模拟持续的流星雨效果。允许用户按下 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_WIDTH 或 y > 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 图形库,实现了一个 高效、流畅的流星雨动画。它采用 批量绘制 提升性能,并使用 随机参数 让动画更具变化性。可以进一步优化 视觉细节,增强沉浸感。

写在后面

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

标签:

C/C++流星雨由讯客互联创业栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“C/C++流星雨