« 風神の門 | トップページ | 一週間ぶり更新 »

2005年10月 2日 (日)

アプリの終了と入力処理

今日は爽やかな秋晴れと涼しい風の吹く、すごしやすい1日でしたねえ^_^ 思わず部屋掃除したあと、板間でお昼寝してましたです。

ということで今回は終了処理(の呼び出し部分)とマウス入力です。まずは終了処理の方から。

終了処理はフレームウィンドウで×がクリックされた場合と、アプリ側で終了アクション(終了ボタンなどがクリックされた)が発生した場合の両方を処理させます。基本的にアプリ側主導で終了処理を行わせるため、ウィンドウプロシージャはWM_DESTROYを検出した場合、アプリ側に終了要求を通知します。

また、アプリ側はオープニングやゲーム本体など状態によりコードが差し替わるため、その都度アプリ側からフレームウィンドウに対して終了要求を受け付けるための関数を登録します。

まずはアプリ側の終了要求の受け取り関数のdsbmain_requestQuit()です。とりあえず現時点ではdsbmain_exit()への遷移を指示だけ行います。また、dsbmain_init()ではdsbmain_requestQuit()をインタフェースを介してControlクラスに登録しています。

dsbmain.cpp

続いてControlクラスの終了処理関数の登録部分とそのインタフェース。終了処理関数はControl::setRequestQuitCallback()で登録し、Control::requestQuit()で呼び出します。

provider.cpp

control.h

control.cpp

最後にウィンドウプロシージャ。WM_DESTROYでControl::requestQuit()するように変更しています。

なんつうか、ウィンドウに関する処理とアプリケーションに関する処理を分離したいがために、ややこしいことなっちゃってます。

次はマウス入力。パッド入力にしたいところですが、PCだとマウスじゃなきゃヤだって方もおられるので、まずはマウスに対応させます。

しかしながら、ゆくゆくパッド対応にもしたいため、マウスイベントをどうこうするでなく、アプリ側のメイン処理でマウス状態を読み取る方式とします。まずはクリック座標をバッファに蓄積して読み出す方式をリングバッファ方式で作ってみます。リングバッファというと実装すると防御力の上がる魔法のアレです。

まずはバッファ制御クラスとマウスドライバです。いろいろメンドウなのでマウスドライバはバッファ制御クラスを継承させちゃいます。

ringbuff.h

ringbuff.cpp

なんかゴチャゴチャ書いてますが、要はFIFOでバッファの上限まで行ったら読み終わったバッファを再利用するってことです。ちなみにスレッド非対応というか、write()が同時に発生するとバッファ壊します。今はまだ対応しなくていいや。

mouse.cpp

マウスドライバ、というよりはアクセサですが、マウスのクリック座標をバッファに格納する関数、取り出す関数を持ちます。write()で格納する箇所は前述のウィンドウプロシージャに追加していますので確認してください。

最後にアプリ側のマウス読み出し処理とインタフェースです。

アプリ側の処理は前述dsbmain.cppにあるとおりで、dsbmain_init()でマウスに対しinit()、start()を行います。読み取りはdsbmain_main()で行っており、バッファからデータを読み出せた場合はデバッグログを出力して動作を確認します。最後はやや儀礼的ですがstop()を実行しています。

以下はインタフェース中のマウス処理に関する部分です。インタフェースだけにたいしたことはやってないですが・・・

相変わらずテストとかしてないので、なんかの条件を満たすとたちどころに動かなくなるかもしれません。

次はそろそろアプリケーションの構造を考え始めないといかんなあ・・・

|

« 風神の門 | トップページ | 一週間ぶり更新 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/109744/6219058

この記事へのトラックバック一覧です: アプリの終了と入力処理:

« 風神の門 | トップページ | 一週間ぶり更新 »