C中的动画文本图像

时间:2009-08-26 16:02:22

标签: c command-line animation

我必须在C中为一个类写一个文本图像程序。没有什么比使用文本写图像更复杂。

关于这个:towel.blinkenlights.nl,我该如何为我的文字制作动画?

3 个答案:

答案 0 :(得分:2)

这是为什么平台? 如果你想要多平台,我建议你使用ncurses

如果仅适用于Windows,您可以使用conio.h和graphics.h等。 我发现this似乎在C中使用一些Windows标头有一些基本的绘图/动画示例。请注意,这是非常不可移植的代码和Windows特定的。

更新:我还发现了this,其中包含一些使用graphics.h的示例

答案 1 :(得分:2)

这是一个示例,向您展示如何动画。这正是星球大战动画的内容。这是一个巨大的文本文件,分为单独的框架。请阅读Star Wars ASCIImation page上的常见问题解答,详细了解相关信息。

一般的想法是你有一组框架。每个帧在动画中包含一个图像。您清除屏幕,显示一个框架,然后等待一段时间。一遍又一遍地做,你有一个文本动画。

首先,您使用框架创建一个文件。称之为frames.txt。为了允许可变长度的帧,我们按照以 @!开头的行跟随每一帧,然后是帧应留在屏幕上的动画刻度数。例如,如果你以每秒15帧的速度绘制,那么该行是 @! 15 ,然后框架将在屏幕上显示1秒钟(15个刻度)。

+---------+
| frame 1 |
+---------+
@! 15
.-----------.
| frame 2   |
|           |
`-----------'
@! 15
+-------------+
| frame 3     |
|             |
|             |
|             |
+-------------+
@! 15
.-----------.
| frame 4   |
|           |
.-----------.
@! 15
+---------+
| frame 5 |
+---------+
@! 3
+---------+
|  rame 5 |
+---------+
@! 3
+---------+
|   ame 5 |
+---------+
@! 3
+---------+
|    me 5 |
+---------+
@! 3
+---------+
|     e 5 |
+---------+
@! 3
+---------+
|       5 |
+---------+
@! 3
+---------+
|         |
+---------+
@! 3

然后编译并运行该程序。在Linux或OSX上,我只是将其保存为 text_animate.cpp 并运行 make text_animate 。在Windows上,您可能唯一需要做的就是将系统(“清除”)的行更改为系统(“cls”),但我不确定。

#include <iostream>
#include <string>
#include <ctime>
#include <fstream>

const char *FRAME_DELIM = "@!";
unsigned int FRAME_DELIM_LEN = strlen(FRAME_DELIM);

int main(int argc, char *argv[]) {
    if( argc != 2 ) {
        std::cout << "Usage: text_animate <frames file>\n";
        exit(1);
    }
    std::string frames_fn = argv[1];
    struct timespec sleep_time = {0, 1000000000 / 15}; // 15 fps

    std::ifstream file_stream;
    file_stream.open(frames_fn.c_str(), std::ios::in);
    if( !file_stream.is_open() ) {
        std::cout << "Couldn't open [" << frames_fn.c_str() << "]\n";
        return -1;
    }

    std::string frame_line;
    unsigned int frame_ticks = 0;
    while( true ) {
            system("clear");

            bool is_frame_delim = false;
            do {
                getline(file_stream, frame_line);
                if( file_stream.fail() && file_stream.eof()) {
                    file_stream.clear();
                    file_stream.seekg(0, std::ios::beg);

                    getline(file_stream, frame_line);
                }
                else if( file_stream.fail() ) {
                    std::cout << "Error reading from file.\n";
                    break;
                }

                is_frame_delim = strncmp(frame_line.c_str(),FRAME_DELIM,
                                         FRAME_DELIM_LEN) == 0;
                if( !is_frame_delim ) {
                    std::cout << frame_line << "\n";
                }
            } while( !is_frame_delim );

        frame_ticks = atoi(&(frame_line.c_str()[FRAME_DELIM_LEN + 1]));

        while( frame_ticks-- > 0 ) {
                    nanosleep(&sleep_time, NULL);
        }
    }

    file_stream.close();

    return 0;
}

然后只需运行 ./ text_animate frames.txt 。按CTRL-C退出,因为它永远循环。

答案 2 :(得分:0)

如果您被允许使用外部库,AALib看起来会有所帮助。如果没有,你可以使用system()函数并传递“cls”(我在这里假设Windows。对于Linux或Mac,使用“clear”):

#include <stdlib.h>
#ifdef WIN32
    system("cls");
#else
    system("clear");
#endif

在那之后,打印一个框架并等到打印下一个框架的时间应该是一个简单的工作。