写在前面
用C++绘制动态飘雪场景的完整代码,营造冬日浪漫氛围。
系列文章
技术需求
- 图形库与窗口管理
- 使用EasyX图形库进行绘图操作,通过
initgraph
创建指定尺寸的绘图窗口,实现可视化界面。 - 调用Windows API获取屏幕分辨率,居中显示窗口,提升用户体验与视觉舒适度。
- 利用
GetHWnd
和SetWindowPos
控制窗口位置,确保画面出现在屏幕中央,增强沉浸感。
- 雪花结构体设计
- 定义
Snow
结构体封装雪花属性:坐标(x, y)、半径(r)、下落速度(speed)和颜色(color),实现数据的模块化管理。 - 每个雪花独立初始化,具备随机位置、大小和速度,模拟自然界中雪花的多样性与无规则性。
- 随机效果与动态更新
- 使用
srand
结合time(NULL)
设置随机种子,保证每次运行程序时雪花分布不同,增强观赏新鲜感。 - 在主循环中逐帧更新雪花位置,通过
Sleep(33)
控制帧率(约30帧/秒),使动画流畅自然。
- 双缓冲绘图与视觉优化
- 先绘制背景图片,再逐个绘制雪花,避免闪烁问题。
- 每次更新前用黑色填充原雪花位置以“擦除”旧图像,再绘制新位置,实现平滑移动效果。
- 边界处理与循环再生
- 当雪花下落超出屏幕底部时,立即调用
InitSnow
重新初始化其位置和参数,形成无限飘落的视觉效果。 - 初始时将雪花置于屏幕上方之外,模拟从天空持续飘落的过程。
- 图像资源加载与色彩控制
- 使用
loadimage
加载外部背景图“鬼怪.jpg”,作为雪景的底层场景,增强画面故事性与艺术氛围。 - 雪花颜色采用白色系RGB值,通过灰度控制实现纯净雪感,与背景形成鲜明对比。
主要代码
创作不易,订阅后可查看完整代码
#include <graphics.h>
#include <time.h>
#include <stdio.h>
#include <conio.h>
#include <vector>
using namespace std;
#define MAXSnow 666 // 设置雪花总数
struct Snow
{
double x; // 雪花横坐标
int y; // 雪花纵坐标
int r; // 雪花的大小
double speed; // 雪花下落速度
int color; // 雪花的颜色
};
Snow snow[MAXSnow]; // 保存所有雪花
// 初始化雪花
void InitSnow(int i, int width, int height)
{
snow[i].x = rand() % width;
snow[i].y = rand() % height - height;
snow[i].r = rand() % 4 + 1;
snow[i].speed = (rand() % 3333) / 1000.0 + 1;
snow[i].color = (int)(255); // 设置雪花颜色
snow[i].color = RGB(snow[i].color, snow[i].color, snow[i].color);
}
// 雪花的下落函数
void MoveSnow(int i, int width, int height)
{
setlinecolor(RGB(0, 0, 0));
setfillcolor(RGB(0, 0, 0));
// 删除原来的雪花
fillcircle((int)snow[i].x, snow[i].y, snow[i].r);
// 计算雪花新位置
snow[i].y += snow[i].speed;
if (snow[i].y > height) InitSnow(i, width, height);
// 画新雪花
setfillcolor(snow[i].color);
setlinecolor(snow[i].color);
fillcircle((int)snow[i].x, snow[i].y, snow[i].r);
}
……
创作流程
我设计这段代码时,心中浮现的是一个静谧寒冷的冬夜,雪花无声地从天而降,落在一片神秘而略带孤寂的场景之上。我想让这幅画面不只是冷冰冰的动画,而是一种情绪的传递——那种独自伫立雪中、世界仿佛慢下来的宁静感。于是,我决定用程序构建一场不会停歇的雪,让观者能在屏幕前感受到季节的呼吸。
一开始,我选择了“鬼怪.jpg”作为背景图,这张图自带一种东方奇幻的氛围,古老屋檐、昏黄灯光与夜色交织,仿佛藏着许多未诉说的故事。为了让这场雪真正融入画面,我不能让它显得机械或重复。因此,我决定让每一片雪花都拥有自己的“性格”:有的大、有的小,有的落得快,有的悠悠飘荡。这种差异不是随意的,而是通过数学随机性赋予的生命力。
我以结构体的形式为每一片雪花建立身份档案,它们不再是简单的像素点,而是有坐标、有速度、有颜色的独立个体。我在脑海中模拟雪花的轨迹:它们从画面之外的高空缓缓出现,穿过视野,最终消失在地面。当一片雪花走完它的旅程,我就让它“重生”于天空之上,继续下一次飘落——这是一种轮回,也是一种永恒的诗意。
为了让动画流畅,我采用了逐帧重绘的策略。每一帧都先清空旧痕迹,再重新绘制背景与所有雪花的新位置。这个过程看似简单,却需要极细的控制:太快会耗资源,太慢会卡顿。我反复调试延迟时间,最终定格在33毫秒,刚好接近人眼感知的流畅阈值,让雪落下得自然而不突兀。
最让我在意的是雪花的视觉表现。我坚持使用纯白色,因为真正的雪在夜里并不炫彩,它是干净的、微亮的,在暗色背景下反而更显温柔。我用圆形来代表雪花,虽不复杂,但胜在简洁真实。每一颗都轻轻点在画布上,像是被风托着,缓缓前行。
整个程序没有复杂的交互,只需按任意键退出。我故意保持这种极简,是希望观者能沉浸其中,不被操作干扰。这场雪不属于我,它属于每一个愿意静静看它飘落的人。当我运行程序,看着成百上千的雪花在古老屋檐下飞舞,我知道,我不仅写了一段代码,更编织了一场冬日的梦。
写在后面
我是一只有趣的兔子,感谢你的喜欢!