
写在前面
用代码写一封情书------这是我在创作这个程序时最初的冲动。这不是一段普通的动画,而是一场献给"她"的视觉告白。通过C++与EasyX图形库的结合,我构建了一个不断跳动、缓缓绽放的爱心矩阵,每一颗跳动的"❤"都承载着情感的震颤。整个程序以数学函数为笔,以时间流逝为墨,在屏幕上绘出一颗永不熄灭的心。
系列文章
| 序号 | 直达链接 |
|---|---|
| 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++哆啦A梦 |
| 15 | C/C++简单圣诞树 |
| 16 | C/C++小宇宙 |
| 17 | C/C++冰墩墩 |
| 18 | C/C++七彩花朵 |
| 19 | C/C++玫瑰花 |
| 20 | C/C++小猪佩奇 |
| 21 | C/C++简易爱心 |
| 22 | C/C++流星雨① |
| 23 | C/C++2048小游戏 |
| 24 | C/C++爱心圣诞树 |
| 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++炫酷烟花③ |
| 38 | C/C++炫酷烟花④ |
| 39 | C/C++星空漩涡 |
| 40 | C/C++流星雨② |
| 敬请期待...... |
技术需求
- 图形环境初始化 :使用
initgraph创建固定尺寸的绘图窗口,奠定视觉展示基础;通过BeginBatchDraw与FlushBatchDraw实现双缓冲绘制,避免画面闪烁,提升动画流畅度。 - 动态数据管理 :设计
MyLove结构体封装每个心形元素的属性,包括位置、大小、状态和编号,实现数据与行为的统一管理,便于批量更新与渲染。 - 数学建模驱动运动:基于极坐标与经典心形函数(如 r = \\sin(\\theta)\\sqrt{\|\\cos(\\theta)\|}/(\\sin(\\theta)+1.4142) - 2\\sin(\\theta) + 2 )计算心形轨迹上的点分布,使整体图形符合数学美感。
- 随机化与去重机制 :通过
GetRand函数结合系统毫秒级时间戳生成种子,确保每次运行都有独特起点,并在生成过程中避免重复值,保证运动轨迹的多样性。 - 视觉表现优化 :采用淡粉色(RGB(255,192,203))作为心形颜色,字体使用Arial并动态调整字号,配合透明背景模式(
setbkmode(TRANSPARENT)),增强视觉柔和感与层次感。 - 精确延时控制 :自定义
HpSleep函数,利用clock()与Sleep(1)结合实现接近毫秒级的延时精度,平衡CPU占用与动画节奏,确保动画稳定运行。 - 动画循环机制:主循环中持续调用更新、显示、刷新与清屏操作,形成闭环动画流程,模拟心跳般持续跳动的效果。
主要代码
创作不易,订阅后可查看完整代码
cpp
#include<graphics.h>
#include<conio.h>
#include<time.h>
#include<math.h>
#include<sys/timeb.h>
struct MyLove
{
int NUMS; // 编号
double m;
double n;
double size;
bool Is_show;
int x;
int y;
};
MyLove mylove[400];
int CenterX = 1000 / 2 - 30;
int CenterY = 600 / 2 - 100;
double Size = 60;
void initdata(); // 初始化数据
void updata(); // 更新
void movedata(); // 平移
void showdata(); // 显示
int* GetRand(int* buf, int count, int range); // 随机数的生成
void heart(int x0, int y0, int size, COLORREF C);
void HpSleep(int ms);
......
创作流程
我开始写这段代码的时候,心里想的不是技术,而是"如何让一颗心真正活起来"。我不想做一个静态的图案,我想要的是呼吸、是脉动、是那种仿佛能听见心跳的声音。于是,我决定用数学来模拟爱的律动。
首先,我选择了心形函数作为核心公式。这个函数并不简单,它融合了正弦、余弦、绝对值与分式运算,能描绘出一个极具美感的立体心形轮廓。我知道,如果直接把所有点画出来,会显得死板。所以我引入了"时间"的概念------让这些点随着每一帧逐渐出现,像是从虚空中被召唤而来。
接着,我设计了一个包含400个元素的数组,每一个都代表一个跳动的"❤"。前20个是先锋,它们根据随机生成的角度参数实时计算位置,构成心形的前沿边界。而后面的380个则像是追随者,通过位移传递的方式,逐帧继承前面的位置信息,形成一种"波浪式推进"的视觉效果,就像心跳时血液的涌动。
为了让这个心不那么机械,我加入了随机性。每一次运行程序,都会从系统时间中提取毫秒级种子,生成一组不重复的初始角度。这样,每一次启动,都是独一无二的心跳节奏。同时,我还让每个字符的大小在一定范围内缓慢放大,模拟"膨胀"的感觉,仿佛这颗心正因激动而加速跳动。
在视觉呈现上,我选择了柔和的粉红色,字体用的是Arial,简洁而优雅。我把背景设为透明,不让任何多余的东西干扰这份纯粹的情感表达。每一个"❤"都微微偏移坐标,让它更自然地落在心形曲线上,而不是生硬地堆叠。
最让我纠结的是节奏。太快像抽搐,太慢又显得冷漠。于是我写了一个高精度延时函数,精确控制每一帧间隔为30毫秒,既不会卡顿,也不会过于急促。当整个画面开始循环刷新时,那种缓缓跳动的感觉终于出现了------像是深夜里,你静静听着另一个人的心跳。
这不仅仅是一个图形程序,它是我在用代码写诗。每一行都是思念的注解,每一次刷新都是情感的重燃。当那颗由400个"❤"组成的巨大心脏在屏幕上缓缓搏动时,我知道,我已经把最柔软的情绪,编译进了最坚硬的逻辑之中。
写在后面
我是一只有趣的兔子,感谢你的喜欢!