突然ですが、吉里吉里のデバックモードをご存知でしょうか。
吉里吉里のコンフィグツールにて設定できます。
設定方法はこちらを参照して下さい。
今回はちょっと踏み込んだ所で、動的ゲーム制作における、デバック機能活用を考えてみます。
具体的には、処理情報をコンソールへ出力し、バグの原因を解明する方法と言った感じです。
■コンソールへの出力
スクリプト内に以下の記述をする事で、
Debug.message("この内容がコンソールに出力されます");
Ctrl+F4で開くコンソールウィンドウに情報を出力する事が出来ます。
当然ですが、変数も使用可能です。
Debug.message("表示位置:" + left + "/" + top);
この場合、leftとtopが変数です。これにより以下の様な文字がコンソールに出力されます。
表示位置:100/95
ここで、更にでバックモードの時だけコンソールに出力する様に設定できます。
//デバック対応
if(System.getArgument("-debug") == "yes")
{
Debug.message("表示位置:" + left + "/" + top);
}
これで、デバックモード中のみ、コンソール出力します。
■動的ゲーム用のデバック機能
ノベルゲームとの違いとして、動的ゲームはシーケンシャルな処理とはならず、通常にデバックメッセージを出力すると、過剰に出力され、結果がわかりにくくなりがちです。
特にコンティニュアスハンドラでの処理でエラーが発生すると、原因特定に時間がかかります。
何せ、高速で処理を回転させているので、普通に出力すると、何百行とデバックメッセージが出力されてしまいます。
これらを解決する方法として、私がやっている方法を紹介します。
コンティニュアスハンドラについては、当ブログでも紹介しました。こちらをご覧下さい。
◆第12回「コンティニュアスハンドラの利用」◆
//------------------------------------
// コンティニュアスハンドラ
//------------------------------------
function handler(tickCount)
{
try
{
//エフェクトの実行
if(tickCount >= nextTime)
{
//次の稼働を20ミリ秒後に設定
//20ミリなので、秒間50fps
nextTime = tickCount + 20;
count++;
}
if(tickCount >= time_d + 1000)
{
showFps(count);
time_d = tickCount;
count=0;
}
}
catch(e)
{
// try ブロック内で例外が発生した場合はレイヤの移動を停止します
// 再び例外を投げます
throw e;
}
}
コンティニュアスハンドラ内でエラーが出るとcatch(e)に処理が飛びます。
これを利用して、配列に出力内容を入れておき、エラー時にそれを出力します。
出力内容としては、直近5個のファンクションの開始と終了を入れておきましょう。
●改造後(出力箇所)
catch(e)
{
//デバック対応
if(System.getArgument("-debug") == "yes")
{
var i;
for(i=0; i<start_function.count; i++)
{
Debug.message("★スタートファンクション[" + i + "]:" + start_function[i]);
Debug.message("★エンドファンクション[" + i + "]:" + end_function[i]);
}
}
throw e;
}
これで、どこで何が原因で落ちたのか一目瞭然。レアケースのバグにも非常に対応しやすいです。
◆つぶつぶ主人公HP◆ ◆サンプルダウンロードの一覧◆
吉里吉里のコンフィグツールにて設定できます。
設定方法はこちらを参照して下さい。
今回はちょっと踏み込んだ所で、動的ゲーム制作における、デバック機能活用を考えてみます。
具体的には、処理情報をコンソールへ出力し、バグの原因を解明する方法と言った感じです。
■コンソールへの出力
スクリプト内に以下の記述をする事で、
Debug.message("この内容がコンソールに出力されます");
Ctrl+F4で開くコンソールウィンドウに情報を出力する事が出来ます。
当然ですが、変数も使用可能です。
Debug.message("表示位置:" + left + "/" + top);
この場合、leftとtopが変数です。これにより以下の様な文字がコンソールに出力されます。
表示位置:100/95
ここで、更にでバックモードの時だけコンソールに出力する様に設定できます。
//デバック対応
if(System.getArgument("-debug") == "yes")
{
Debug.message("表示位置:" + left + "/" + top);
}
これで、デバックモード中のみ、コンソール出力します。
■動的ゲーム用のデバック機能
ノベルゲームとの違いとして、動的ゲームはシーケンシャルな処理とはならず、通常にデバックメッセージを出力すると、過剰に出力され、結果がわかりにくくなりがちです。
特にコンティニュアスハンドラでの処理でエラーが発生すると、原因特定に時間がかかります。
何せ、高速で処理を回転させているので、普通に出力すると、何百行とデバックメッセージが出力されてしまいます。
これらを解決する方法として、私がやっている方法を紹介します。
コンティニュアスハンドラについては、当ブログでも紹介しました。こちらをご覧下さい。
◆第12回「コンティニュアスハンドラの利用」◆
//------------------------------------
// コンティニュアスハンドラ
//------------------------------------
function handler(tickCount)
{
try
{
//エフェクトの実行
if(tickCount >= nextTime)
{
//次の稼働を20ミリ秒後に設定
//20ミリなので、秒間50fps
nextTime = tickCount + 20;
count++;
}
if(tickCount >= time_d + 1000)
{
showFps(count);
time_d = tickCount;
count=0;
}
}
catch(e)
{
// try ブロック内で例外が発生した場合はレイヤの移動を停止します
// 再び例外を投げます
throw e;
}
}
コンティニュアスハンドラ内でエラーが出るとcatch(e)に処理が飛びます。
これを利用して、配列に出力内容を入れておき、エラー時にそれを出力します。
出力内容としては、直近5個のファンクションの開始と終了を入れておきましょう。
●改造後(出力箇所)
catch(e)
{
//デバック対応
if(System.getArgument("-debug") == "yes")
{
var i;
for(i=0; i<start_function.count; i++)
{
Debug.message("★スタートファンクション[" + i + "]:" + start_function[i]);
Debug.message("★エンドファンクション[" + i + "]:" + end_function[i]);
}
}
throw e;
}
これで、どこで何が原因で落ちたのか一目瞭然。レアケースのバグにも非常に対応しやすいです。
◆つぶつぶ主人公HP◆ ◆サンプルダウンロードの一覧◆
スポンサーサイト
2014.04.16 / Top↑
| Home |