Анимированные текстовые изображения в C - PullRequest
1 голос
/ 26 августа 2009

Я должен написать программу с текстовым изображением на С для класса. Ничего сложного, просто напишите изображение с помощью текста.

В отношении этого: полотенце.blinkenlights.nl, как я могу оживить мой текст?

Ответы [ 3 ]

2 голосов
/ 26 августа 2009

Вот пример, чтобы показать вам, как оживить что-то. Это именно то, что анимация Звездных войн. Это гигантский текстовый файл, разделенный на отдельные кадры. Прочитайте часто задаваемые вопросы на странице 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 для выхода, поскольку он зацикливается навсегда.

2 голосов
/ 26 августа 2009

Для какой платформы это нужно? Если вам нужно что-то мультиплатформенное, я бы предложил вам использовать ncurses .

Если это только для Windows, вы, возможно, можете использовать conio.h и graphics.h среди других. Я нашел this , в котором, похоже, есть несколько базовых примеров рисования / анимации в C с использованием некоторых заголовков Windows. Имейте в виду, что это крайне непереносимый код и специфичен для Windows.

Обновление: я также нашел это , которое включает в себя несколько примеров использования graphics.h

0 голосов
/ 26 августа 2009

Если вам разрешено использовать внешние библиотеки, AALib выглядит так, как будто это поможет. Если нет, вы, вероятно, могли бы использовать функцию system () и передать «cls» (я предполагаю, что Windows здесь. Для Linux или Mac используйте «clear»):

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

После этого следует распечатать кадр и подождать, пока придет время напечатать следующий кадр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...