DXライブラリでマイクラのデバッグ画面みたいなやつを作る


DXライブラリのアドベントカレンダーを一人で埋めていくシリーズです。

今回作りたいのはこんなやつ↓
画像引用元

下のグラフとかはまたやる気があったらやってみます。(多分やらない)
今回は上の数字とか文字がいっぱいあるやつをやります。

実装方針

といっても簡単な話で、背景に半透明の矩形を描画したうえに文字列を描画させます。
また、すべての処理箇所で使用したいのでグローバル空間においておきます。

補足

フォントはDxLib_Init()のあとでしか読み込めませんので、グローバル空間に置く場合、コンストラクタ内ではフォントは読み込めません。

実装

DebugConsole.h
#include<vector>
#include<DxLib.h>

class Debug {
    std::vector<std::string> List; //描画する項目
    int FontHandle; //描画するフォント
public:
    void Init() { //フォントを使用しない場合はいらない
        FontHandle = CreateFontToHandle("MSゴシック", 16, 2);
    }

    void Add(std::string text) { //描画する項目を追加
        List.push_back(text);
    }

    void Add() { //空行を追加
        List.push_back("");
    }

    void Update() {
        int i = 0;
        for (auto& t : List) {
            if (t == "") { //空行処理
                i++;
                continue;
            }
            int x, y, l;
            SetDrawBlendMode(DX_BLENDMODE_ALPHA, 127); //背景の矩形を半透明にする
            GetDrawStringSizeToHandle(&x, &y, &l, t.c_str(), t.length(), FontHandle); //各行の大きさを取得
            DrawBox(0, i * y, x, i * y + y, 0x000000, TRUE); //背景の矩形を描画
            SetDrawBlendMode(DX_BLENDMODE_NOBLEND, 0); //半透明から通常に戻す
            DrawStringToHandle(0, i * y, t.c_str(), 0xffffff, FontHandle); //文字列をフォントを使って描画

            i++;
        }
        List.clear(); //すべて描画し終えたら、リストを消去する
    }
};

Debug debug;

使用例

main.cpp
#include <DxLib.h>
#include "DebugConsole.h"

void foo() {
    debug.Add();
    debug.Add("foo");

    if (CheckHitKey(KEY_INPUT_A) != 0) {
        debug.Add("A ia pushed");
    }
    debug.Add();
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR IpCmdLine, int nCmdShow) {
    ChangeWindowMode(TRUE);

    if (DxLib_Init() == -1) {
        return -1;
    }

    SetDrawScreen(DX_SCREEN_BACK);

    SetBackgroundColor(0xbc, 0xe2, 0xe8);//背景を水色に

    debug.Init();

    while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) {
        debug.Add("1");
        debug.Add("2");
        foo();
        debug.Add("3");


        debug.Update();
    }
    DxLib_End();

    return 0;
}

実行結果

Aキー押してないとき

Aキー押してるとき

このように、実行順に上から描画されます。

最後に

何かあったら不備や改善点があればコメントで教えてください