ViVi Home > 技術文書 > さくさく理解する C/C++ コンソールアプリ入門 > ダブルバッファ


 

 

ダブルバッファ
Copyright (C) 2014 by Nobuhide Tsuda

ダブルバッファ

リアルタイムゲームの場合、各フレーム毎に、背景を描画し、スプライトを描画する。
この時、描画中の状態が見えてしまうと、画面がチラチラして見苦しくなってしまう。

通常、その問題を解決するために「ダブルバッファ」というテクニックが使用される。
「ダブルバッファ」とは、その名のとおり、バッファを2つ用意し、そのどちらか一方を実際に表示し、表示していないバッファの方に描画し、 描画が終わった段階で、表示するバッファを切り替えるテクニックだ。

ダブルバッファを実装するには、複数のコンソールWin32 で用意されているAPIを利用する。
それなりに面倒なので、抽象化したクラスを作成した。

ソースコード

使い方

DblBuffer 色名

以下の色名が宣言されている。「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,

DblBuffer メンバ関数

void setColor(int);

描画色指定

void setColor(int fg, int bg);

描画色、背景色指定

void setCursorPos(int x, int y);

カーソル位置指定

void write(const char *);

文字列表示

void write(const wchar_t *);

ユニコード文字列表示

void write(const std::string &);

文字列表示

void write(const std::wstring &);

文字列表示

void swap();

表示バッファ切り替え

使用例

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