ViVi Home > 技術文書 > さくさく理解する C/C++ コンソールアプリ入門 > ダブルバッファ
リアルタイムゲームの場合、各フレーム毎に、背景を描画し、スプライトを描画する。
この時、描画中の状態が見えてしまうと、画面がチラチラして見苦しくなってしまう。
通常、その問題を解決するために「ダブルバッファ」というテクニックが使用される。
「ダブルバッファ」とは、その名のとおり、バッファを2つ用意し、そのどちらか一方を実際に表示し、表示していないバッファの方に描画し、
描画が終わった段階で、表示するバッファを切り替えるテクニックだ。
ダブルバッファを実装するには、複数のコンソールWin32 で用意されているAPIを利用する。
それなりに面倒なので、抽象化したクラスを作成した。
ソースコード
以下の色名が宣言されている。「DblBuffer::RED」の様に利用する。
BLACK = 0x00,
DARK_BLUE = 0x01,
DARK_GREEN = 0x02,
DARK_CYAN = 0x03,
DARK_RED = 0x04,
DARK_VIOLET = 0x05,
DARK_YELLOW = 0x06,
GRAY = 0x07,
LIGHT_GRAY = 0x08,
BLUE = 0x09,
GREEN = 0x0a,
CYAN = 0x0b,
RED = 0x0c,
VIOLET = 0x0d,
YELLOW = 0x0e,
WHITE = 0x0f,
INTENSITY = 0x08, // 高輝度マスク
RED_MASK = 0x04,
GREEN_MASK = 0x02,
BLUE_MASK = 0x01,
描画色指定
描画色、背景色指定
カーソル位置指定
文字列表示
ユニコード文字列表示
文字列表示
文字列表示
表示バッファ切り替え
#include "DblBuffer.h"
int main()
{
DblBuffer db;
for (int i = 0; i < 80*23; ++i) {
db.setCursorPos(0, 0);
db.setColor(COL_GRAY, COL_BLACK);
db.write("using DblBuffer");
db.setCursorPos(0, 1);
db.setColor(COL_GRAY, COL_BLACK);
for (int k = 0; k < 80*23; ++k) {
db.write("."); // 背景描画
}
db.setCursorPos(i%80, i/80+1);
db.setColor(COL_YELLOW, COL_BLACK);
db.write("@"); // 自機描画
db.swap();
Sleep(100);
}
}