まあせっかくだから
今回の顛末をちょこっと記録しておこうと。なんか誰かの役に立つかもしれんし(たたないよ
まず、前提として以下のようなことがありました。
- 土曜日に突然開発マシンで止まるようになった。
- 「なんだろう?」と思いつつ、とりあえず別のマシンにコピーして動かしてみる。すると何事も無かったように動く。
- 「えー?なにいじったっけー?」と思い返してみたが、大幅な変更をした記憶がない。
上記のプログラムは、「敵がいる方向を指し示すためのカーソル描画」の処理なんですが、これ自体は木曜に実装していて、その時は何も問題なく動いてました。描画化けとかもして無かったですし(<実はココ重要)。
大きく弄った部分は、
- 敵との距離によってカーソルのスケールが変わるように描画することにした(上記プログラムで言うと "+ rate" の部分)。
くらいで、これだって別に問題の部分(i++)を弄ることも無いし(というか弄る意味が解らない)。
その時はまだここが原因だということは解ってなかったので、とりあえず「なにが原因で止まってるの?」という事を、まず調べることにしました。
手順というか、経緯は以下のような感じ。
- ゲーム開始後、ちょっと経って止まる(つまりタイトルでは止まらない)。
- ゲーム開始後に止まるというタイミングをみると、どうやら「敵出現」がキーらしい。
- 試しに敵出現を切ると止まらない。つまり敵が原因?と思った。
- 敵の処理を色々切るが、それでも止まる。何もしないと今度は「当たり判定」の処理の「NaN」が原因で止まる。
- それで、最低限必要なメンバの初期値を設定するも、それでも止まる。
- しゃーないので、メインループにデバッグ出力をかまして調べてみると「drawTsk()」で止まってる模様。
- 「んならどのタスク描画で止まってるん?」と思ってデバッグ出力すると、 TSK_GROUP の 8 で止まってるとの事。
- 8 ってつまり「TSKsystemDraw」(さっきのプログラムがある描画関数)だよね...。これしかないよね...?
- 試しに描画切って見たら動いた。
- んで、プログラムをボーっと眺めてみたら...「あっ!」
- 解決
そもそもの原因は、最初の状態で、何故まともに動いてた(フリをしてたのか)ということだ。プログラムってると、わりとこういう「たまたま動いてます」的な現象はあるけど、今回の場合、「他のマシンでは(問題のあるバイナリだけど)動いてる」というのもあって、「えーひょっとしてボクのマシン壊れた?」なんていう考えにまで至ってしまって、まあ壊れてたのはボクのプログラムなのでよかったんですけど(というか当たり前)、逆にいうと「間違ったプログラムはその時点で間違った挙動をして欲しいなあ」と思わずにいられないというか、まあ、そうそう簡単な話ではないんですけどね。
前に話した NaN よりは単純な話なんですけど、単純なバグほど細部に宿る、といったところでしょうか。「神は細部に宿る」のです。そんなにコソコソしないで頂きたい。もっと堂々と表に出ていただきたいのです(何の話だ)。