Heliodor 2019/11/15 18:34

ログについて

以前、ゲーム中で発生したエラーメッセージなんかは画面内コンソールに表示するようにした、という話をしたと思うのですが、それはあくまでも「公開版のゲーム」での話でして、開発デバック中に発生したログメッセージなんかは普通にコンソールウィンドウに出すようにしています。

そのあたりはコンソールウィンドウの方が自力でログウィンドウを作るよりも楽なんですよね。

コンソールアプリとは異なり WinMain で動いているプログラムはコンソールウィンドウを持っていませんが、実は AllocConsole でコンソールウィンドウを追加することができます。

ただ AllocConsole() を実行するだけでコンソールウィンドウが出てくるのですが、そのままだ stdout とコンソールウィンドウが結びついていないので、いくら printf とかやっても画面は真っ黒なままです。

stdout の出力先が AllocConsole で作ったコンソールウィンドウになるように設定するには stdout を freopen します。
そうすれば printf("Hello\n") とかでテキストを表示することができます。

// コンソール開く
AllocConsole();
freopen("CON", "w", stdout);
freopen("CON", "r", stdin);

...

// コンソール閉じる
// ※freopen でコンソールウィンドウに関連付けた stdin, stdout を戻しておく。
// そうしないと FreeConsole を呼んでもウィンドウが閉じない
freopen("NUL", "w", stdout);
freopen("NUL", "r", stdin);
FreeConsole();

ところで、特になにも考えずにコンソールウィンドウにテキストを出すと、黒字に白い文字になりますよね。
ログメッセージには当然エラーメッセージとか警告、単なるデバックメッセージなどいろいろな種類があるのですか、それらを全て白文字で出すとなんだかよく分からない事になります。

どうせならエラーメッセージは赤く、警告は黄色で、単なるデバックメッセージは目立たない色で出したいですよね!

Win32Apiにはコンソールウィンドウのテキスト属性を設定する関数がありまして、それを使うと文字や背景色、文字の出力位置などを指定することができます。
(SetConsoleTextAttribute で検索すると出てきます)

と言うわけで、自前のログシステムにそれらの仕組みを取り込んで、コンソールウィンドウに分かりやすく色分けされた形でメッセージが流れるようにしました。

この仕組み自体は「滅びの国の王女」で既に出来上がっていたのですが、「あやかし紅白戦」を作るにあたってテキストファイルへの出力やサイズ制限、バイナリデータを16進文字列化して出力などいろいろ機能を追加した結果(自分の中では)わりと使えるものになったので、ここで公開したいと思います。



フォロワー以上でソースコードをダウンロードできます。
例によってこのプログラムを使用したことによる責任は一切負いません。
その代わり、組み込み、改造、再配布など全て自由です。

これは、実行するといくつかのサンプルログを出力するという、ただそれだけのモノです。
有料特典はコンパイル済みのサンプル実行ファイルで、ビルドの手間が省けます。

フォロワー以上限定無料

まずは無料プランで様子見を。 お気軽にフォローしてみて下さい。

無料

【 500円 】プラン以上限定 支援額:500円

このバックナンバーを購入すると、このプランの2019/11に投稿された限定特典を閲覧できます。 バックナンバーとは?

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

記事のタグから探す

月別アーカイブ

限定特典から探す

記事を検索