前回
コンソールゲーム制作 第1章 描画(1)
前回はコンソール用の出力関数の一覧を確認できたので、コンソールの構造を考えながら適切な関数を選んでいきます。
コンソールの構造
実際に使ってみた自分なりの解釈ですが、コンソールの構造はこんな感じです(必要な情報のみ)
コンソール
要素 | 備考 |
---|---|
スクリーンバッファ | 画面に表示される情報の格納庫 |
カーソル | 入力用の情報の格納庫 |
スクリーンバッファ
要素 | 備考 |
---|---|
セル[文字数分] | 1マスに格納されている情報 |
フォント | 画面に文字を書き込む際のフォント情報 |
カーソル
要素 | 備考 |
---|---|
色 | 書き込む際の文字色とその背景色 |
座標 | 書き込み位置 |
セル
要素 | 備考 |
---|---|
文字 | セルに表示される文字 |
色 | セルに表示される文字色とその背景色 |
出力関数の仕様
上記のコンソールの仕様を基にそれぞれの出力関数の仕様を解説していきます。
画面サイズを横40, 縦10だとします。
x >= 0 && x < 40 ( x = 0 ~ 39 ) y >= 0 && x < 10 ( y = 0 ~ 9 )
まずは、
- SetConsoleTextAttribute:カーソルの色(文字、背景)を設定します。
色(赤, 青)
を設定すると
コンソール->カーソル->色 = 赤 | 赤
- SetConsoleCursorPosition:カーソル位置を設定します。
位置(6, 3)
を設定すると
コンソール->カーソル->位置 = (6, 3)
- FillConsoleOutputAttribute:指定位置から指定したセル分の色(文字・背景)を再設定する。
位置(x=5, y=5)、セル数(3)、文字色(青)、 背景色(赤)
を指定すると、
コンソール->スクリーンバッファ->セル[5][5]->色 = 青 | 赤 コンソール->スクリーンバッファ->セル[6][5]->色 = 青 | 赤 コンソール->スクリーンバッファ->セル[7][5]->色 = 青 | 赤
の3マスが一気に塗りつぶされます。
xは39までなのでもし、位置(x=38, y=5)、セル数(3)、文字色(青)、 背景色(赤)
を指定すると、
コンソール->スクリーンバッファ->セル[38][5]->色 = 青 | 赤 コンソール->スクリーンバッファ->セル[39][5]->色 = 青 | 赤 コンソール->スクリーンバッファ->セル[0][6]->色 = 青 | 赤
という風に次の行にずれます。
- FillConsoleOutputCharacter:指定位置から指定したせる分の文字を再設定する。
位置(x=5, y=5)、セル数(3)、文字色('A')
を指定すると、
コンソール->スクリーンバッファ->セル[5][5]->文字 = 'A' コンソール->スクリーンバッファ->セル[6][5]->文字 = 'A' コンソール->スクリーンバッファ->セル[7][5]->文字 = 'A'
今度はその範囲を文字で埋めます。
- WriteConsole:指定した位置から指定した文字列を書きこむ。
WriteConsoleの場合は位置を指定して文字列をその位置から書き込むだけです。
位置(x=5, y=5)、文字列("abc")
を指定すると、
コンソール->スクリーンバッファ->セル[5][5]->文字 = 'a' 色 = カーソルの色 コンソール->スクリーンバッファ->セル[6][5]->文字 = 'b' 色 = カーソルの色 コンソール->スクリーンバッファ->セル[7][5]->文字 = 'c' 色 = カーソルの色
になります。色に関してはSetConsoleTextAttributeで指定した色になります。
標準出力関数のprintfの中でもこれが使われています。
- WriteConsoleOutputAttribute:指定した長方形ブロックに含まれる文字セルに、色(文字・背景)の再設定します。
FillConsoleOutputAttributeとほとんど同じですが、書き込む際の画面内の範囲が決められます。
- WriteConsoleOutputCharacter:指定した長方形ブロックに含まれる文字セルに、色(文字・背景)の再設定します。
FillConsoleOutputCharacterとほとんど同じですが、書き込む際の画面内の範囲が決められます。
- WriteConsoleOutput:指定した長方形ブロックに含まれる文字セルに、文字と色(文字、背景)。
WriteConsoleOutputAttributeとWriteConsoleOutputCharacterを混ぜたものです、
唯一色と文字が同時に変えられるので優秀です。
結論
WriteConsoleOutputを使いましょう。
理由としては、一瞬で画面全体を書き直せるからです。
少しずつ画面を書き換えると、書き終わった場所と終っていない場所の差が見えてしまって、画面がチラついてゲームになりません。
色を変えるだけでしたら、FillConsoleOutputAttributeまたはWriteConsoleOutputAttributeでもいいですが、ゲームとはいえ意外と文字も活躍します。(いつか文字の応用の仕方の記事を書きます)
次回
適切な関数はWriteConsoleOutputでした、次は実際の例をあげて使い方を説明します。