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キー押してるとき
このように、実行順に上から描画されます。
最後に
何かあったら不備や改善点があればコメントで教えてください