2009-08-26 2 views
1

Мне нужно написать программу для текстового изображения в C для класса. Ничего сложного просто написать изображение с помощью текста.Анимированные тексты в C

Что касается этого: towel.blinkenlights.nl, как я могу анимировать текст?

+0

Возможно, вам стоит попытаться объяснить более подробно то, что вы хотите достичь, и в чем проблема. – hlovdal

+0

Мне нужно написать программу, которая отображает текст как изображение. Как printf ("****** \ n"); printf ("******** \ n"); printf ("*** \ n"); и так далее. . Однако мне любопытно, как анимировать текст, как этот парень, если вы открываете свой терминал и набираете его в: towel.blinkenlights.nl – HollerTrain

+0

точке hlovdal: терминал (с или без проклятий?) Или gui (какой из них ? Xlib ?, Qt ?, SVGAlib? Windows?)? – dmckee

ответ

2

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

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

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

+0

Я не хочу, чтобы графика отображалась, но используя текстовые символы, чтобы выглядеть как графика. – HollerTrain

+0

ncurses и conio предназначены именно для этого. Ну, не только для этого, но это способы манипулирования экранными персонажами с гораздо большим контролем, чем просто печать строк. Одна вещь, которую они могут сделать, это «анимационные» персонажи. –

0

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

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

После этого, он должен быть простое задание распечатать кадр и подождать, пока не приступит к печати следующего.

2

Вот пример, чтобы показать вам, как оживить что-то. Это именно то, что анимация Star Wars. Это гигантский текстовый файл, разделенный на отдельные кадры. Читайте FAQ на Star Wars ASCIImation page, чтобы узнать больше об этом.

Общая идея заключается в том, что у вас есть набор кадров. Каждый кадр содержит одно изображение в анимации. Вы очищаете экран, показываете рамку и ждете некоторого периода времени. Делайте это снова и снова, и у вас есть текстовая анимация.

Итак, сначала создайте файл с вашими рамками. Назовите его frame.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, чтобы выйти, так как он петли навсегда.

Смежные вопросы