2009-08-26 6 views
1

Je dois écrire un programme d'image de texte en C pour une classe. Rien de compliqué, il suffit d'écrire une image en utilisant le texte.Images de texte animé en C

En ce qui concerne: towel.blinkenlights.nl, comment puis-je animer mon texte?

+0

Vous devriez probablement essayer d'expliquer un peu plus en détail ce que vous voulez réaliser et quel est le problème. – hlovdal

+0

Je dois écrire un programme qui affiche du texte en tant qu'image. Comme printf ("****** \ n"); printf ("******** \ n"); printf ("*** \ n"); et ainsi de suite. Cependant, je suis curieux de savoir comment animer le texte, comme ce gars a fait si vous ouvrez votre Terminal et tapez ceci dans: towel.blinkenlights.nl – HollerTrain

+0

au point de hlovdal: terminal (avec ou sans curses?) Ou gui (dont un ? Xlib ?, Qt ?, SVGAlib? Windows?)? – dmckee

Répondre

2

Pour quelle plateforme est-ce? Si vous voulez quelque chose de multiplateforme, je vous suggère d'utiliser ncurses.

Si c'est juste pour Windows, vous pouvez probablement utiliser conio.h et graphics.h entre autres. J'ai trouvé this qui semble avoir quelques exemples de dessin/animation de base en C en utilisant certains en-têtes Windows. Soyez avisé qu'il s'agit d'un code extrêmement non portable et spécifique à Windows.

Mise à jour: Je trouve également this qui comprend quelques exemples dans l'utilisation graphics.h

+0

Je ne veux pas de graphiques à afficher, mais en utilisant caractères de texte pour ressembler à des graphiques. – HollerTrain

+0

ncurses et conio sont exactement pour ça. Eh bien, pas seulement pour ça, mais ce sont des façons de manipuler les personnages à l'écran avec beaucoup plus de contrôle que par simple impression de lignes. Une chose qu'ils peuvent faire est "animer" les caractères. –

0

Si vous êtes autorisé à utiliser des bibliothèques externes, AALib ressemble à cela aiderait. Sinon, vous pouvez probablement utiliser le système() fonction et passer « cls » (je suppose ici de Windows pour Linux ou Mac, utilisez « clair ».):

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

Après cela, il devrait être travail simple pour imprimer un cadre et attendre qu'il soit temps d'imprimer le suivant.

2

Voici un exemple pour vous montrer comment animer quelque chose. C'est exactement ce que l'animation de Star Wars est. C'est un fichier texte gigantesque divisé en cadres individuels. Lisez la FAQ au Star Wars ASCIImation page pour en savoir plus.

L'idée générale est que vous avez un ensemble de cadres. Chaque image contient une image dans l'animation. Vous effacez l'écran, affichez un cadre, puis attendez un certain temps. Faites-le encore et encore, et vous avez une animation de texte.

Donc d'abord vous créez un fichier avec vos cadres. Appelez-le frames.txt. Pour autoriser les trames de longueur variable, nous suivons chaque trame par une ligne commençant par @! suivi du nombre de ticks d'animation que le cadre doit rester sur l'écran. Par exemple, si vous dessinez à 15 images par seconde et que la ligne est @! 15, puis le cadre sera à l'écran pendant 1 seconde (15 ticks).

+---------+ 
| 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 

Ensuite, compilez et exécutez ce programme. Sous Linux ou OSX, je l'enregistre sous text_animate.cpp et exécute make text_animate. Sur Windows peut-être que la seule chose que vous aurez à faire est de changer la ligne qui dit système ("clear") en système ("cls"), mais je ne sais pas avec certitude.

#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; 
} 

Puis lancez simplement frames.txt ./text_animate. Appuyez sur CTRL-C pour quitter car il boucle pour toujours.