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
※コンソールウィンドウに出力されます。
解説
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ファイルへの出力なども使用してデバッグしましょう。