【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次元ベクトルクラスを作るときは内部のデータとして静的な配列を使えば問題ありま

記事を読む

OpenCVで矢印を描画する

OpenCVで矢印を描画するという関数が無いみたいだったので作りました。書いていることは参考リンク先

記事を読む

AAアニメーション

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

記事を読む

【C言語/C++】関数ポインタと関数オブジェクトを使ってみる

関数ポインタを使う 関数ポインタはポインタの一種で文字通り関数のポインタの事で、関数を遠隔操作でき

記事を読む

【C言語/C++】フォルダ作成を行う

C言語、C++でフォルダを作成するには『direct.h』にある『_mkdir』関数を使うことで実現

記事を読む

【C言語/C++】はてなの演算子の三項演算子について

C言語などのサンプルにたまに出てくるはてな(?)の演算子は 『?』と『:』の2つで1つの演算子であ

記事を読む

no image

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

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

記事を読む

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

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

記事を読む

画像をAA化してみるサンプル

画像をAA化するサンプルです。自分のPCなどの端末にある画像を選択するとそれをAA化することができま

記事を読む

【C言語/C++】関数の宣言・定義まとめ

1 関数プロトタイプ宣言・定義 1-1 プロトタイプ宣言 1-2 定義 2 ファイ

記事を読む

Windowsユーザが初めてMacBookを購入したときの注意点や感想

最近12インチのMacBookを購入しました。今までWindowsしか

Redmine3.2をUbuntu14.04にインストールして躓いた所についてメモ

はじめに Ubuntu14.04 ServerにRedmine3.2

UWSCを使ったソフト自動立ち上げ【SoftEther VPN Server】

やりたいこと 最近SoftEtherという筑波大学発のベンチャー企業

【PHP】headerでContent-Typeを指定したのに効かない場合の対処法

PHPでサイトマップを作ろうと思い、XML形式のファイルを出力しようと

スマホ向け幅固定サイトの回転時の幅対応方法

幅固定サイトでのスマホ回転時Webサイトの横幅を合わせる方法のメモ。

【PHP】特定のURLからそのAtomやRSSのフィードを抽出する方法

特定のURLからRSSやATOMのフィードを抽出する方法をメモ。 流

フィード抽出ツール(RSS1.0、RSS2.0、atom)

任意URL サイト名 サイトURL RSS1.0

→もっと見る

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