系列文章
序号 | 直达链接 |
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++语言实现流星雨动画的完整代码。
技术需求
-
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 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. 代码功能概述
这段代码的主要功能是:
- 在 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 图形库,实现了一个 高效、流畅的流星雨动画。它采用 批量绘制 提升性能,并使用 随机参数 让动画更具变化性。可以进一步优化 视觉细节,增强沉浸感。
写在后面
我是一只有趣的兔子,感谢你的喜欢!