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); } }