我必须在C中为一个类写一个文本图像程序。没有什么比使用文本写图像更复杂。
关于这个:towel.blinkenlights.nl,我该如何为我的文字制作动画?
答案 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
在那之后,打印一个框架并等到打印下一个框架的时间应该是一个简单的工作。