【C言語/C++】コンソールでAAアニメーション
コンソール上でAA(アスキーアート)のアニメーションをさせます。
手順としてはパラパラ漫画になる文字列を複数用意します。そして、コンソールに一つのコマを表示させ、指定秒後にそれを消して、次のコマを表示させるというのをずっと繰り返します。
ここでコンソールの文字を消す方法ですが、
①printfの際に末尾に特殊文字(エスケープシーケンス)の「\r」を使う
②windows.hを使って、system(“cls”)とする
というものがあります。
2番目の方法は内部コマンドを呼び出しているようなので少し時間がかかってしまいおすすめできません。なので今回はなるべく行の先頭に復帰するというエスケープ文字「\r」を使ってやります。(※エスケープ文字はOSによって挙動が若干異なるようです。今回はWindowsを利用しています。)
ただし、このエスケープ文字はその行の先頭に戻るだけなので改行をまたぐと効果は無くなってしまいますので1行の文字列からなるアニメーションのみでしか使えないという所に注意が必要になります。
また、指定秒停止させる方法ですが、これはwindows.hのSleep関数に指定のミリ秒を引数とすることでその間だけ停止させることができます。
とりあえず簡単なサンプル
#include<stdio.h>
#include<windows.h>
int main(void){
while (1) {
printf("(_ _ ) \r");
Sleep(500);
printf("(_ _ )Z \r");
Sleep(500);
printf("(_ _ )ZZ \r");
Sleep(500);
printf("(_ _ )ZZZ\r");
Sleep(1000);
}
}
ここで気を付けなければならないのは画面がリフレッシュされるわけではなく、単に書き出し位置を先頭に戻しているだけなので文字の長さは同じにしておかないと前に出力された文字がそのまま表示されてしまうということです。
また、これは1行だけ戻るだけなので2行以上でなるAAアニメーションはsystem(“cls”)を使わなければならないです。
とりあえずそのサンプルを作成しました。
「使うAAのテキストデータ」をファイル読み込みをして、各コマを文字配列(2次元)に格納した後に繰り返し文で表示⇒消去⇒表示⇒…を繰り返します。
AA文字の表示ではフォントが大事になってくるのでコンソール画面の文字フォントを「MS Pゴシック」に変更します。これについてはこちらの「cmd.exe(コマンド プロンプト)のフォントを変更する」の記事が非常に参考になりました。
#include<stdio.h>
#include<windows.h>
int main(void){
FILE *fp;
char buf[2048]={0};//サイズは適当。あまり大きくしすぎると止まる
char aa[20][2048]={0};//ここに各コマを入れる
int count = -1;
int i=0;
//AAファイルの読み込み
if((fp=fopen("aa.txt","r"))!=NULL){
while(fgets(buf,2048,fp)!=NULL){
//「投稿」の文字の含まれる行で区切られている
if(strstr(buf,"投稿")!=NULL){
count++;
}
if(count>=0){
//1コマ分までくっつける
strcat(aa[count],buf);
}
}
fclose(fp);
while(1){
//1コマを表示
printf("%s",aa[i++]);
//一時停止
Sleep(100);
//画面をクリア
system("cls");
if(i>count){
i=0;
}
}
}
return 0;
}
コンソール画面の幅が狭いせいでところどころ変な改行が出現してしまっているので幅を広くします。
結構改善されました。
ここまで見てC言語でやる必要ないと思われるかもしれないのでjavascript版も用意しました。
関連記事
-
-
OpenCVで矢印を描画する
OpenCVで矢印を描画するという関数が無いみたいだったので作りました。書いていることは参考リンク先
-
-
【C言語/C++】配列をシャッフルしてランダムに入れ替える
C言語・C++で配列をシャッフルする方法 Fisher–Yatesシャッフルアルゴルズムにより配列
-
-
【C言語/C++】はてなの演算子の三項演算子について
C言語などのサンプルにたまに出てくるはてな(?)の演算子は 『?』と『:』の2つで1つの演算子であ
-
-
【C++】行列演算ライブラリEigen
デフォルトのCやC++には行列やベクトルなどの演算ライブラリはありません。なので行列計算などをしよう
-
-
【C言語/C++】int整数などの数値をchar配列の文字列に変換する
C++であればstringが使えて非常に便利ですが、C言語で文字列というと基本的にはcharの配列を
-
-
【C言語/C++】ファイルをCSV形式でfprintfを使って保存・書き込みする
数値計算などをC言語でプログラミングするとき、その演算結果をファイルとして保存する必要性がでてくるこ
-
-
【C++】既に main.obj で定義されています
error LNK2005: 既に main.obj で定義されています。 fatal error
-
-
【C言語】fscanfでファイルを1行ずつ読み込む
C言語のfscanfでCSV形式(単純なカンマ区切り)のファイルを読み込むサンプル。 基本的なこと
-
-
画像をAA化してみるサンプル
画像をAA化するサンプルです。自分のPCなどの端末にある画像を選択するとそれをAA化することができま
-
-
【C言語/C++】fgetsを使ってファイルを読み込む
fgetsで単純にファイルを読み取る C言語、C++でfgetsを使ってファイルを読み込む方法です