我正在尝试制作一个动画,它将从圆点形成一个基本圆圈。我卡住了,因为我不知道如何制作一个数组来自动更新自己制作动画。我的程序有一个问题,因为它只显示圆圈和其他的最后一点,之前的点因系统(“清除”)命令而消失,但我不知道如何使它成为正确的方法。 提前谢谢!
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(void){
char tab[43][132];
int a, b, t;
double x_kropki, y_kropki;
for (t=0 ; t<360 ; t++) {
x_kropki=floor(10*cos((t*pi)/180))+60;
y_kropki=floor(10*sin((t*pi)/180))+20;
for (a=0 ; a<43 ; a++, printf("\n")) for (b=0 ; b<132 ; b++) {
if ((int)y_kropki==a && (int)x_kropki==b){
tab[a][b]='.';
printf("%c", tab[a][b]);
}else {
tab[a][b]=' ';
printf("%c", tab[a][b]);
}
}
system("clear");
}
return 0;
}
答案 0 :(得分:0)
动画应该是什么样的?你想让圆圈慢慢生长吗?然后你需要添加一个延迟(sleep
或类似的),否则它将过快地完成整个过程,以便画面和你的眼睛注意到。
此外,你不应该清除每个新点后的进度(似乎总共360点)。要实现这一点,您需要稍微改变一下方法。这是循环的样子:
您会看到清除后,您需要重复打印到目前为止的进度。在循环迭代180中,您需要再次打印最后179个点加上 180。等待几毫秒,然后清除,然后相同的181。
你是怎么做到的?你重复for
循环:
int dot, maxDots;
for (maxDots = 0; maxDots < 360; maxDots++) {
for (dot = 0; dot < maxDots; dot++) {
// your location calculations and printing for each dot
}
system("clear");
}
这至少应该给你一些成长的圈子。但是你会注意到印刷方法很难做到,因为一旦完成一条生产线,你就无法回头了。如果你从顶部开始沿着180度逐渐下降,那么你需要逐行上升,直到你再次到达顶部。这不会轻易奏效。正如@Weather Vane建议的那样,不是直接打印,而是将每个动画阶段的待打印结果存储在缓冲区中。这是屏幕坐标的抽象。一个非常简单的方法是可以自由操作的二维数组,然后整体打印整个数组。