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