【C言語/C++】コンソールでAAアニメーション

公開日: : 最終更新日:2014/08/14 AA, 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);
	}
}
zzzaa.gif

ここで気を付けなければならないのは画面がリフレッシュされるわけではなく、単に書き出し位置を先頭に戻しているだけなので文字の長さは同じにしておかないと前に出力された文字がそのまま表示されてしまうということです。
また、これは1行だけ戻るだけなので2行以上でなるAAアニメーションはsystem(“cls”)を使わなければならないです。
とりあえずそのサンプルを作成しました。

使うAAのテキストデータ」をファイル読み込みをして、各コマを文字配列(2次元)に格納した後に繰り返し文で表示⇒消去⇒表示⇒…を繰り返します。

AA文字の表示ではフォントが大事になってくるのでコンソール画面の文字フォントを「MS Pゴシック」に変更します。これについてはこちらの「cmd.exe(コマンド プロンプト)のフォントを変更する」の記事が非常に参考になりました。

caaimg3.jpg
↑再起動すると追加されています

#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;
}
caa0.gif

コンソール画面の幅が狭いせいでところどころ変な改行が出現してしまっているので幅を広くします。

caaimg1.jpg
↑画面上右クリックでプロパティを選択

caaimg2.jpg
↑画面サイズを広げます

caa1.gif

結構改善されました。
ここまで見てC言語でやる必要ないと思われるかもしれないのでjavascript版も用意しました。

スポンサーリンク
Amazon
  • このエントリーをはてなブックマークに追加

関連記事

【C++】多次元ベクトルクラスを作る

3次元ベクトルクラスや2次元ベクトルクラスを作るときは内部のデータとして静的な配列を使えば問題ありま

記事を読む

【C言語】文字列に指定の文字列が含まれるか調べる

ある文字列に指定の文字列が含まれるかどうかを調べるにはstring.hにあるstrstr関数を使いま

記事を読む

【C++】ファイルの読み込みまとめ

C++におけるファイル読み込みのまとめ ファイルの開き方 値の取得方法 >>演算子

記事を読む

AAアニメーション

javascriptでAAアニメーションしました。AAは以下のところから参照しました。(AAアニメー

記事を読む

【C言語/C++】余りを求める剰余演算子(%)を使う

基本的なことかもしれませんが、C言語やC++などであまりを出すには剰余演算子である『%』を使います。

記事を読む

no image

【C++】既に main.obj で定義されています

error LNK2005: 既に main.obj で定義されています。 fatal error

記事を読む

【C言語/C++】ファイルをCSV形式でfprintfを使って保存・書き込みする

数値計算などをC言語でプログラミングするとき、その演算結果をファイルとして保存する必要性がでてくるこ

記事を読む

【C言語】fscanfでファイルを1行ずつ読み込む

C言語のfscanfでCSV形式(単純なカンマ区切り)のファイルを読み込むサンプル。 基本的なこと

記事を読む

【C++】行列演算ライブラリEigen

デフォルトのCやC++には行列やベクトルなどの演算ライブラリはありません。なので行列計算などをしよう

記事を読む

【C言語/C++】配列をシャッフルしてランダムに入れ替える

C言語・C++で配列をシャッフルする方法 Fisher–Yatesシャッフルアルゴルズムにより配列

記事を読む

【Laravel5】既存のDBからデータを取得して表示する

はじめに 今まで作ったWebサイトをLaravel5で見れるようにし

【C++/OpenCV】cv::Matの画像にインパルスノイズを付加する

OpenCVで画像にノイズを付け足したいと思って調べたところ、Pyth

Intel Corei7-7700TでHTC Viveの動作確認

はじめに HTC ViveというVRヘッドセットで遊んでみたのでその

【Python】フォルダ内のカッコ付き数字ファイルを一括でリネームするスクリプト

はじめに タイトルどおりなのですが、指定フォルダ内のファイルのファイ

OpenCV3.1のTracking APIでトラッキングを試す

はじめに 先日OpenCV3.1をopencv_contrib付きで

パソコンを複数台使う際便利なツール

はじめに 先日、機械学習用にGPUを積んだBTOパソコンを購入しまし

OpenCV3.1をopencv_contrib付きでVisual Studio2013でビルドしてインストールする

はじめに OpenCV3.1でトラッキングがしたいと思いインストーラ

→もっと見る

  • Author : ががんぼ
    プログラミングやWeb関係で気付いたことについてメモしていく予定。だいたいが備忘録ですが、自分でサンプルを作って動かしてみたりしています。
PAGE TOP ↑