LoginSignup
6
3

More than 5 years have passed since last update.

コンソールゲーム制作 第1章 描画(2)

Posted at

前回

コンソールゲーム制作 第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でした、次は実際の例をあげて使い方を説明します。

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3