首先来看效果
C/C++动态爱心
源代码(代码思路主要参考了b站up主码农天高)
#define _CRT_SECURE_NO_WARNINGS#include#include#include#include#include#include//要调用mciSendString必须包含这个头文件#pragma comment(lib,"WINMM.LIB");//及这个预处理#define SIZE 9#define CANVAS_WIDTH 640#define CANVAS_HEIGHT 480#define CANVAS_CEBTER_X CANVAS_WIDTH / 2#define CANVAS_CEBTER_Y CANVAS_HEIGHT / 2void scatter_inside(int xo, int yo, double beta = 0.1){//随机内部扩散double ratio_x = -beta * log(rand());double ratio_y = beta * log(rand());double x, y;x = ratio_x * xo;y = ratio_y * yo;putpixel(x, y, RGB(245,145,247));}void heart(int particle,double ratio,COLORREF color){double x, y;//记录直角坐标double i;//控制循环和心的精细程度//笛卡尔爱心//for (i = 0; i <= 2 * size; i += 0.1)//{//m = i;//n = -size * (((sin(i) * sqrt(fabs(cos(i)))) / (sin(i) + 1.4142)) - 2 * sin(i) + 2);//x = n * cos(m) + xo;//y = n * sin(m) + yo;//putpixel(x, y, color);//}for (i = 0; i <= 2 * particle; i += 0.001){//关键,画爱心的公式x = 16 * (sin(i) * sin(i)* sin(i));y = -(13 * cos(i) - 5 * cos(2 * i) - 2 * cos(3 * i) - cos(4 * i));//控制爱心的大小x = x * ratio;y = y * ratio;putpixel(x, y, color);//扩散if((int)(i*10000)% 7 == 0)//扩散粒子太多了,控制粒子产生量scatter_inside(x, y);if ((int)(i * 10000) % 107 == 0)scatter_inside(x, y, 0.07);//爱心里面加字settextcolor(RGB(91, 176, 179));//设置爱心字体颜色settextstyle(40, 0, L"楷体");outtextxy(0, 0, L"喵");}}int main(){srand(time(0));initgraph(CANVAS_WIDTH, CANVAS_HEIGHT);//添加音乐mciSendString(L"open youhebuke.mp3 alias music", 0, 0, 0);mciSendString(L"play music repeat",0,0,0);//+repeat循环播放----------------------------------------------------------------------------------------- //开头界面,可删除settextcolor(RGB(245,152,173));//颜色参数调配,画图板查看颜色参数settextstyle(15, 0, L"宋体");outtextxy(300, 300, L"----被虐的喵");settextcolor(RGB(91, 176, 179));//颜色参数调配,画图板查看颜色参数settextstyle(40, 0, L"楷体");outtextxy(175, 180, L"C/C++版跳动爱心");fflush(stdout);Sleep(10000);cleardevice();//清画布,重新画-----------------------------------------------------------------------------------------setorigin(CANVAS_CEBTER_X, CANVAS_CEBTER_Y);//循环播放while (1){double ratio;//控制粒子频率和图像大小for (int i = 140; i <= 250; i++){ratio = 16 * sin(i / 360.0 * 3.1415926535);}if (ratio < 0){ratio *= -1; }//Sleep(10);heart(80, ratio, RED);cleardevice();}mciSendString(L"close music", 0, 0, 0);getchar();closegraph();return 0;}
这次写的代码有点臭,耦合度太高了,以至于修改一个参数会导致整体改变。于是就没实现爱心跳动了。
一,下载一个可视化库,推荐easyx
直接去官网下载https://easyx.cn/
下载好后会有这个exe文件
打开文件,点下一步到这个界面
选择你要配置的编译器,它就会自动帮你将库配置好。
第二步 将所要的头文件,画布大小设置好
第三步 初始化画布,并画一个普通的爱心
最初我用的笛卡尔公式。画出来的爱心并不是很好看。我在网上不断找也找不到满意的公式,最终还是借用了b站up码农天高找的这个公式
为什么要手动控制呢?因为最初创建窗口位置默认坐标为
四 爱心渲染
接下来要对这个爱心渲染,就要不断在它每个点的周围随机渲染一些点,这里就需要获取每个点的坐标,但是由于函数只能返回一个值,我也没用类。所以直接在heart函数内部写了个渲染函数
又因为随机所以用到rand(),产生随机数,至于这个scatter_inside函数实现思路我依旧是参考up主码农天高的。
参数我没控制好,就变成这样了。反正自己根据画布和画的爱心大小,慢慢调去
对了,这里颜色是可以控制的
使用RGB(xxx,xxx,xxx)红绿蓝的参数,而如果像按照自己喜欢的颜色调,打开画图板
点击编辑颜色,里面就有颜色参数、
第五步 让爱心按一定频率波动起来
也就是画n张大小不同的连续图,循环播放,这里频率控制我用的是正选函数sin,这里就是我自己找到公式实现了,
我选的是这个频率段,这样既可以让爱心收缩也放大,但是由于我写的耦合性太高,导致不能轻易改频率,会导致改变爱心大小。以及如果每次爱心动起来,缩放,周围粒子坐标也要有一定改变,但由于我能力有限,再加上耦合度高,全用函数实现,难以获得坐标,所以我就没实现了。
将sin函数公式转为代码
这时我也不用size控制大小了,直接用ratio,反正这个爱心大小自己慢慢调。
基本上这就是我的爱心实现流程了。
补:添加音乐和汉字
添加音乐用到的函数有 mciSendString();
要包含
这两个,不然会出现链接错误
我来解释一下怎么使用
首先将你要加入的xxx.mp3音乐放入所在路径
右键这里,打开所在文件夹,将音乐放入其中
然后使用mciSendString(L”open xxx.mp3 alias music”,0,0,0)
这些字符串意思是open打开音乐文件(open是系统调用接口),给它命名music.传3个000参数过去。
然后再调用mciSendString(L”play music repeat”,0,0,0);
播放music 后面repeat可以不加,不加只播放一次,加了就是重复播放。
添加汉字
这个数easyx提供的函数接口,具体使用参考EasyX 文档 – 文字输出相关函数
这里仅提供在爱心里插入文字
将他们放入heart函数里,在爱心和随机散射粒子画出来后,在执行这三行代码
outtextxy(坐标,坐标,L”文本内容”);
这里坐标参考第一步画的爱心位置来估计大概范围
outtextxy可多次调用,多次输入。