Вот пример, чтобы показать вам, как оживить что-то. Это именно то, что анимация Звездных войн. Это гигантский текстовый файл, разделенный на отдельные кадры. Прочитайте часто задаваемые вопросы на странице Star Wars ASCIImation , чтобы узнать больше об этом.
Общая идея заключается в том, что у вас есть набор кадров. Каждый кадр содержит одно изображение в анимации. Вы очищаете экран, показываете кадр, а затем ждете некоторое время. Делайте это снова и снова, и у вас будет текстовая анимация.
Итак, сначала вы создаете файл со своими фреймами. Назовите это 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, пожалуй, единственное, что вам нужно сделать, это изменить строку с надписью system («clear») на system («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 для выхода, поскольку он зацикливается навсегда.