今回は、ガチなプログラミングのお話しです。
12月1日から、Managed DirectX で開発をしやすくするために、XNA フレームワークのGameクラスに似た抽象クラスの作成を始めました。
要件は
(1) 抽象クラスは、デバイスの生成と破棄、キーボードとマウスからの入力、フルスクリーン・ウィンドウ表示切り替え、エラーイベントのハンドリング、および、メインループの主制御を行う。
(2) 継承したクラスでは、初期化(Initialize)、コンテンツロード(LoadContent)、コンテンツアンロード(UnloadContent)、データの更新(Update)、表示の更新(Draw)、及び、破棄(Dispose)の6つのメソッドをオーバーライドして処理を記述するだけでOKとする。
(3) 副次的要件として、二重起動の抑止と、二重起動時に最初に起動されたインスタンスのウィンドウを前面に表示するコーディングテンプレートを用意する。
というものです。
ところが、先週の金曜に抽象クラスのコーディングも一段落したので、テストプログラムを作成して実行したところ、フルスクリーン時にウィンドウがフォーカスを失うとメインループのApplication.DoEvents();の箇所で、デバイスロストイベントが発生するではないですか!
もちろん、プログラムには、デバイスロスト時のコードは、仕込みました。
仕込んだつもりでした。
しかし、エラーイベント発生時のスタックトレースを見ると、抽象クラスで記述したコードはスタックのどこにも見あたりません。
つまり、コードのどこかにハンドルされていないパスが存在しているってことです。
それから、丸一日、パスの通っていない箇所を探したのですが…
日曜日未明にリザインしました。
こういう時は、書いたコードを破棄して、動くコードからやり直しです。
もっとも、まるまる書き直す必要はありません。
先週記述したコードにも流用できる箇所がありますから、動くコードに少しずつ追加してゆけばよいのです。
というかんじで、現在、コーディングのやり直し中です。
主要要件で残るのは、フルスクリーン・ウィンドウ切り替え機能の追加だけになりました。
それが終われば、先週の金曜の段階まで進捗したことになります。
さて、もうひと頑張りです!