Siv3Dでprintfデバッグをする

はじめに

Siv3Dでちょっとしたゲームを作るときに使える(かもしれない)printfデバッグ用マクロを紹介します。

ただし本記事にprintfではなくstd::coutを使ったコードです。タイトル詐欺です。だってstd::coutデバッグなんていい方誰もしてないからね…

あとマクロ関数を使って実装します。 Siv3D要素めっちゃ薄いほぼほぼC++記事です。

コード全文

# include <Siv3D.hpp>
//Debugマクロ    
#ifdef _DEBUG 
#define DPrint(var) std::wcout<<#var<<L":"<<var; \
std::cout << " TYPE:"<<typeid(var).name();\
std::wcout<< L" LINE:"<<Pad(__LINE__, { 3, L'0' }) << L" FILE:"<<__FILE__;

#define DPrintln(var)  std::wcout<<#var<<L":"<<var; \
std::cout << " TYPE:"<<typeid(var).name();\
std::wcout<< L" LINE:"<<Pad(__LINE__, { 3, L'0' }) << L" FILE:"<<__FILE__<<std::endl;

#else
//Release時はなにもしない
#define DPrint(var)
#define DPrintln(var)  
#endif // DEBUG

void Main()
{
    Console::Open();
    const float number = 12.3;
    const Rect Square(30, 220, 120, 80);
    const String textA = L"Siv3D";
    const String textB = L"プログラミング";
    const Texture texture(L"Example/Windmill.png");
    const Texture emptyTexture;    

    DPrintln(number);
    printf("\n");
    DPrintln(Square);
    printf("\n");
    DPrintln(textA+textB);
    printf("\n");
    DPrintln(texture.size);
    printf("\n");
    DPrintln(texture.isEmpty());
    printf("\n");
    DPrintln(emptyTexture.isEmpty());

    WaitKey();
}

実行結果

number:12.3 TYPE:float LINE:028 FILE:c:\(ディレクトリ省略)\main.cpp

Square:(30,220,120,80) TYPE:struct s3d::Rectangle<struct s3d::Point,int> LINE:030 FILE:c:\(省略)\main.cpp

textA+textB:Siv3Dプログラミング TYPE:class s3d::String LINE:032 FILE:c:\(省略)\main.cpp

texture.size:(480,320) TYPE:struct s3d::Point LINE:034 FILE:c:\(省略)\main.cpp

texture.isEmpty():0 TYPE:bool LINE:036 FILE:c:\(省略)\main.cpp

emptyTexture.isEmpty():1 TYPE:bool LINE:038 FILE:c:\(省略)\main.cpp

f:id:movementi:20180112231948j:plain ※コンソールウィンドウに出力されます。

解説

DPrint(var) std::wcout<<#var<<L":"<<var; \
std::cout << " TYPE:"<<typeid(var).name();\
std::wcout<< L" LINE:"<<Pad(__LINE__, { 3, L'0' }) << L" FILE:"<<__FILE__;

#var

()に入れたマクロ関数の引数の文字列そのものが出る。

typeid(var).name();

型の名前を出す。std::coutを使う。

__LINE__

ソースコードの行数

Pad(__LINE__, { 3, L'0' })

幅と埋め文字を指定して出力。この場合幅3埋め文字0で出力する。唯一のSiv3D要素。ここを__LINE__に書き換えればSiv3D依存がなくなります。

__FILE__

コードが書かれているファイルの場所。

使い方

DPrint()またはDPrintln()に文字列なり数値なりそれらに勝手に変換してくれるSiv3Dの型なりを入れて使いましょう。ln付きは最後に改行します。Releaseビルド時は何もしません。

DPrintln(textA+textB);で文字列の結合もできます。すごいですね。
Vec2型やCircle型は勝手に変換されて出力されます。すごいですね。

最初に書きましたがちょっとしたゲーム用です。「ちゃんと数値入ってるかな?」「このインスタンス今何が入っているのかな?」用です。 assert()やlogファイルへの出力なども使用してデバッグしましょう。