先上代码,需要看程序的运画效果,请自挪到下面的网址里。
//本程序动画网址: https://www.douyin.com/video/7603283479270296867
#include "sprites.h" //包含C++精灵库
using namespace std;
Screen screen{"绘3D红球再滚动",480,720}; //建立屏幕对象
Sprite r{"blank"}; //建立角色叫r,无造型(没有真身)
int main(){ //主功能块
int d= 100;
float step = 3.14159535897932*d/360.0; //每次红球移动的距离
r.bgcolor("black").hide().speed(0).color("red").pu(); //一开始角色诞生到背景为黑色的并且自身隐藏的环境之中
//塑造自己的真身,重复100次画一个模拟的3D红球
for(int i=0;i<100;i++) r.penshade(i).dot(d-i).wait(0.05);
r.pencolor("black").write("8",36); //画笔颜色设为黑并且写8字
string filename = "res/3dball.png"; //设立要保存的png文件名
screen.savepng(filename, {-d/2, d/2, d,d},true);//截取所画图形,保存
r.clear().shape(filename).show().wait(1); //清除所画图形把角色设为filename
int k= 1;
while(true){ //不断重复,让角色滚动,
r.right(1*k).addx(step*k).wait(0.01);
//下面是碰到边缘就反弹
if(r.xcor()+d/2>=240 || r.xcor()-d/2<=-240)k=-k;
}
r.done(); //完成了 (不过这句代码永远不会执行)
return 0; //返回0
}
从前,有一个叫阿红的家伙(角色r),天生是个戏精。它所在的舞台叫screen,是个480×720的剧场,老板给这个剧场取个名叫名:"绘3D红球再滚动"。( 对应代码:Screen screen{"绘3D红球再滚动",480,720}; )
阿红一开始是隐形人(.hide()),行动快如闪电(speed(0)),手里拿着一支红色画笔(color("red"),还把笔抬在空中(pu()),一副"我要搞事情"的架势。
第一幕:给自己画张脸(千层饼式自恋)
阿红决定给自己画一张3D的脸。它有个强迫症:要画100层!每层都比上一层小一号,颜色还越来越深(penshade(i))。就像个美妆博主,一层粉底不够,要叠一百层,越叠越觉得自己立体。
for(int i=0;i<100;i++) —— 这循环就是阿红的自恋循环,每0.05秒就自恋一下:dot(d-i),画个小圆点。100层下去,硬是把一个平面图P成了"拟3D"效果。阿红看着镜子说:"哎呀,这光影,这立体感,我都快相信自己是真3D了!"
人生哲理①:有时候,我们层层包裹自己,以为叠得越多越立体,其实可能只是在自我感动。
第二幕:在脑门上写个"8"(强行卖萌)
画完脸,阿红觉得还不够,拿黑笔在脑门上写了个"8"字(write("8",36))。字体还挺大(36号)。
为啥是8?因为8躺着就是∞,立着就是发财,横竖都不亏。阿红心想:"我这叫商标意识,以后大家看到红球带8,就知道是我!"
人生哲理②:人人都想在世界上留下自己的记号,哪怕只是个简单的符号,也想被记住。
第三幕:咔嚓!自拍发朋友圈
画完了,得保存成果啊!阿红让摄影师Screen给它截了个图(screen.savepng),存成3dball.png,还特意加了透明背景(true),显得高级。
然后它洗掉脸上的妆(clear()),把刚才的自拍设为新头像(shape(filename)),闪亮登场(show())!
人生哲理③:我们精心打造形象,截图保存,然后活成了自己P过的样子。
第四幕:在边界反复横跳(社畜日常)
现在阿红开始表演核心才艺:一边转圈一边跑!
它给自己设了个step,每步都要右转1度(right(1*k)),同时横着挪一步(addx(step*k)),0.01秒一次,跑得飞快。
关键是那个k变量!一开始k=1,阿红往右冲;一旦冲到舞台右边(xcor()+d/2>=240),立马k=-k,掉头往左;冲到左边(xcor()-d/2<=-240),又k=-k,掉头往右……
就这样,阿红在这个480像素的舞台上,永无止境地左右横跳,像极了一只被框住的仓鼠,或者说——
像极了在996和躺平之间反复横跳的当代年轻人。
while(true) —— 这行代码最狠,真·无限循环,没有break,没有return,阿红要跑到天荒地老,直到程序被强制关闭(或者电脑没电)。
人生哲理④:人生如while(true),看似自由奔跑,其实不过是在既定边界里反复碰撞。那个k=-k,就是我们每次说要"改变人生",其实只是换个方向继续撞墙。
尾声:那个永远到不了的r.done()
你注意到没?代码最后写了r.done()和return 0,但这两个命令永远执行不到!因为while(true)是个死循环,阿红永远困在"转圈-移动-撞墙-反弹"的闭环里。
这像极了我们的人生:总以为"等我XXXX就解脱了",但那个done(),可能只是个永远无法抵达的注释。
🎯 终极哲理总结
这个程序告诉我们:
人生就像阿红,一开始花大力气给自己画皮(100层for循环),然后在脸上贴标签(写8),把自己活成一张PNG图片(社会化身份),最后在一个虚空的舞台上,用
while(true)表演"自由奔跑",其实只是在if(边界)处反复k=-k。
那个k=-k,是反弹的物理公式,也是生活的黑色幽默——你以为掉头就是改变,其实只是在反向继续原来的轨迹。
而真正的done(),可能需要我们主动按下Ctrl+C,或者——重新定义自己的screen大小。