C - 在终端中创建动画 - 自动更新2D数组

时间:2017-11-15 18:42:17

标签: c arrays animation

我正在尝试制作一个动画,它将从圆点形成一个基本圆圈。我卡住了,因为我不知道如何制作一个数组来自动更新自己制作动画。我的程序有一个问题,因为它只显示圆圈和其他的最后一点,之前的点因系统(“清除”)命令而消失,但我不知道如何使它成为正确的方法。 提前谢谢!

#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;
}

1 个答案:

答案 0 :(得分:0)

动画应该是什么样的?你想让圆圈慢慢生长吗?然后你需要添加一个延迟sleep或类似的),否则它将过快地完成整个过程,以便画面和你的眼睛注意到。

此外,你不应该清除每个新点后的进度(似乎总共360点)。要实现这一点,您需要稍微改变一下方法。这是循环的样子:

  1. 什么都不画
  2. 画点1
  3. 清除
  4. 绘制第1点和第2点
  5. 清除
  6. 绘制第1点和第2点以及第3点
  7. 您会看到清除后,您需要重复打印到目前为止的进度。在循环迭代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建议的那样,不是直接打印,而是将每个动画阶段的待打印结果存储在缓冲区中。这是屏幕坐标的抽象。一个非常简单的方法是可以自由操作的二维数组,然后整体打印整个数组。