文章目录
写在前面
C/C++语言实现流星雨动态效果的完整代码。
系列文章
序号 | 直达链接 |
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++粉色动态爱心 |
技术需求
图形绘制技术
- 使用 EasyX 图形库实现图形窗口的创建、图片加载与显示、图形绘制(如星星的圆形)等操作。
- 主要函数包括:
initgraph
、putimage
、solidcircle
、setfillcolor
等。
随机数生成技术
- 使用
rand()
函数生成随机数,控制星星和流星的位置、速度、颜色及样式,增加动画的随机性和动态效果。
- 使用
动画实现技术
- 通过循环更新星星和流星的坐标,实现动态移动效果。
- 使用批量绘图函数
BeginBatchDraw
和EndBatchDraw
提高绘图效率,减少屏幕闪烁。 - 控制帧率:通过
Sleep(10)
设置延迟时间,平滑动画效果。
多媒体播放技术
- 使用 Windows 多媒体接口
mciSendString
实现背景音乐的加载与循环播放。
- 使用 Windows 多媒体接口
数据结构与结构体
- 使用结构体
Star
和Meteor
分别存储星星和流星的属性,如坐标、速度和样式,方便管理和更新。
- 使用结构体
资源加载与管理
- 加载外部图片资源(
1.jpg
、2.jpg
和background.jpg
)作为动画元素,提升视觉效果。
- 加载外部图片资源(
性能优化技术
- 限制星星和流星的数量,减少计算与绘图开销。
- 使用批量绘图技术确保动画流畅运行。
完整代码
#include <stdio.h>
#include <graphics.h>
#include <conio.h>
#include <math.h>
#include <Windows.h>
#include <time.h>
#include <mmsystem.h>
#pragma comment(lib, "winmm.lib")
#define PI 3.1415926535897932384624
#define MAXSTAR 300 // 限制星星数量,减少性能消耗
#define MAXMETEOR 199 // 流星数量
// 定义图片变量
IMAGE img1, img2, background;
// 星星结构体
struct Star
{
int x, y;
int speed;
int color;
} star[MAXSTAR];
// 流星结构体
struct Meteor
{
int x, y;
int speed;
int style;
} meteor[MAXMETEOR];
// 初始化星星
void initStar(int i)
{
star[i].x = rand() % 1500;
star[i].y = rand() % 1000;
star[i].speed = rand() % 8 + 1;
star[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);
}
// 绘制并移动星星
void drawAndMoveStar(int i)
{
setfillcolor(star[i].color);
solidcircle(star[i].x, star[i].y, 2); // 绘制小圆作为星星
star[i].x += star[i].speed;
if (star[i].x > 1500)
{
initStar(i); // 重新初始化超出边界的星星
}
}
……
代码分析
以下是对这段C语言代码的详细分析,内容包括程序功能、逻辑结构、各部分代码的功能解释、图形库的使用,以及关键函数和数据结构的作用分析。
1. 代码功能概述
本程序通过使用 C 语言结合图形库(EasyX),实现了一个流星与星星动画效果,背景中播放音乐。主要功能如下:
- 背景设置:加载一张背景图片作为画布。
- 星星动画:绘制多颗不同颜色的星星,并使它们以不同速度从左向右移动,当超出边界时重新出现。
- 流星动画:动态生成多颗流星,以一定速度沿对角线方向移动,且有两种不同的样式。
- 背景音乐播放:通过 Windows 多媒体接口播放一首背景音乐,并设置为循环播放。
- 性能优化:通过批量绘图(BeginBatchDraw/EndBatchDraw)和减少星星与流星数量,确保程序运行流畅。
2. 代码结构分析
1. 头文件与宏定义
#include <stdio.h>
#include <graphics.h>
#include <conio.h>
#include <math.h>
#include <Windows.h>
#include <time.h>
#include <mmsystem.h>
#pragma comment(lib, "winmm.lib")
- graphics.h:EasyX 图形库的头文件,用于图形绘制。
- math.h:用于数学运算(未直接使用)。
- Windows.h:用于调用 Windows API。
- time.h:用于随机数种子初始化。
- mmsystem.h:多媒体头文件,用于播放音乐。
- 宏定义:
#define PI 3.1415926535897932384624 #define MAXSTAR 300 // 限制星星数量 #define MAXMETEOR 199 // 流星数量
- 定义了圆周率
PI
,虽然代码未使用。 - 定义了星星与流星的最大数量,限制了程序性能开销。
- 定义了圆周率
2. 数据结构
struct Star
{
int x, y; // 星星的坐标
int speed; // 星星的移动速度
int color; // 星星的颜色
} star[MAXSTAR];
- Star 结构体用于存储每颗星星的属性:
x, y
:坐标位置。speed
:移动速度。color
:颜色,RGB 格式。
struct Meteor
{
int x, y; // 流星的坐标
int speed; // 流星的移动速度
int style; // 流星的样式
} meteor[MAXMETEOR];
- Meteor 结构体用于存储每颗流星的属性:
x, y
:坐标位置。speed
:移动速度。style
:流星样式(0 或 1)。
3. 星星初始化与移动
函数:initStar(int i)
void initStar(int i)
{
star[i].x = rand() % 1500; // 随机横坐标
star[i].y = rand() % 1000; // 随机纵坐标
star[i].speed = rand() % 8 + 1; // 速度范围 [1,8]
star[i].color = RGB(rand() % 256, rand() % 256, rand() % 256); // 随机颜色
}
- 初始化星星的初始位置、速度和颜色,保证每颗星星的属性都随机。
函数:drawAndMoveStar(int i)
void drawAndMoveStar(int i)
{
setfillcolor(star[i].color); // 设置填充颜色
solidcircle(star[i].x, star[i].y, 2); // 绘制半径为 2 的小圆
star[i].x += star[i].speed; // 星星向右移动
if (star[i].x > 1500) // 超出边界
{
initStar(i); // 重新初始化
}
}
- 功能:
- 使用
solidcircle
绘制小圆表示星星。 - 星星向右移动,若超出边界则重新初始化。
- 使用
4. 流星初始化与更新
函数:initMeteor(int i)
void initMeteor(int i)
{
meteor[i].x = rand() % 2200 - 1200; // 横坐标范围 [-1200, 1000]
meteor[i].y = -400; // 初始纵坐标在画布上方
meteor[i].speed = rand() % 15 + 5; // 速度范围 [5,19]
meteor[i].style = rand() % 2; // 样式:0 或 1
}
- 将流星随机放置在画布外的上方区域,并赋予速度和样式。
函数:updateAndDrawMeteor()
void updateAndDrawMeteor()
{
for (int i = 0; i < MAXMETEOR; i++)
{
meteor[i].x = meteor[i].x + meteor[i].speed / 2;
meteor[i].y = meteor[i].y + meteor[i].speed / 2;
if (meteor[i].style == 0)
{
putimage(meteor[i].x, meteor[i].y, &img1, SRCPAINT);
}
else
{
putimage(meteor[i].x, meteor[i].y, &img2, SRCPAINT);
}
if (meteor[i].x > 1500 || meteor[i].y > 1000)
{
initMeteor(i);
}
}
}
- 功能:
- 流星沿对角线移动(x 和 y 同时增加)。
- 使用
putimage
显示流星图片。 - 如果流星超出边界,重新初始化位置。
5. 主函数
功能概述:
- 加载资源:加载背景图片和流星图片。
- 播放背景音乐:通过
mciSendString
调用 Windows 多媒体接口播放音乐。 - 初始化:初始化星星和流星。
- 主循环:
- 批量绘图,先清除画面再绘制背景、星星与流星。
- 控制帧率以保证动画流畅。
3. 总结
- 图形动态效果:通过 EasyX 图形库实现星星和流星的动态效果,利用随机数保证多样性。
- 资源加载与音乐播放:合理使用图片和音频资源,增加程序的视觉与听觉体验。
- 性能优化:通过控制星星与流星数量,以及批量绘图方式,确保了流畅运行。
- 可扩展性:程序框架清晰,可以方便地增加更多动画元素或修改效果。
此代码展示了 C 语言在图形编程方面的应用,同时结合了多媒体功能,是一个完整的图形动画程序。
写在后面
我是一只有趣的兔子,感谢你的喜欢!