第13章 伸びる豆腐(1)
2006年10月11日
ゲームと一概に云ったところで、そのジャンルは多岐に渡り、中には未だ既存のジャンルに分けられないような奇抜なアイデアを持って生まれているものもある。
その歴史についてはさておき、中でも、コンピューターゲームと呼ばれるジャンルは比較的歴史が浅く、また、現在もっとも開発が盛んなものだと云えよう。(←個人的見解)
そう云ったわけで、今回もゲームの為の実験を試みていくことにしよう。
ちょうどポチポチと画面に白四角を並べるのに飽きてきた頃(?)だし、今回はもう少し目に見える動きをつけてみようと思う。
そんなこんなで、完成したアプリケーションの目標完成状態が次のとおり。
もちろん、このアプリケーションの使用方法も説明せねばなるまい。
今回も入力はマウス。
クライアントエリア内の任意の場所を、マウスの左クリックで指示してやる。
すると、その座標に向かって白四角が1ドットずつ近づいていくわけで、結果、左図のように線が引かれていくわけである。
入力が任意のため、実行結果が左図と同じ模様を描くとは限らない、と云う事実は云うまでも無い。
それでは早速以下のソースをコンパイルして、その実行結果を確認してみよう。
え?いま説明したとおりではないのか、って?
やだなぁ、そんなすんなり動いたことが、未だかつてありましたか?
さて、実行結果の検証の前にこのソースの解説にあたろう。
まずは今回の目標である、白四角に動きをつける処理について。
この処理を行っているのは、今回新たに追加することにした”main_process.cpp”内の関数MainTransaction()である。
この中で行われている処理は変数new_position_x、new_position_yと変数old_position_x、old_position_yを比較し、それぞれに加減算を行った結果をもとに、白四角を描画する、と云ったものである。
関数InvalidateRect()を最後にもってきたのは、白四角の描画が直ちにクライアント領域へ反映されることを狙ってのこと。
忘れると、またWM_PAINTメッセージを手動(?)で生成する羽目になる。
ここで出てきた、変数new_position_x、new_position_yはマウスの左クリックされた座標を指し、関数SetPosition()を”main_callback.cpp”内のWM_LBUTTONDOWNメッセージで処理することで目標座標を取得している。
なんで関数SetPosition()なんてものを用意したのか、と云う疑問を感じられた方は第10章に書かれた私のポリシーを参照して頂きたい。
別にこんな面倒なポリシーに賛同する必要も無いわけだが、今回のソースも私が書いたもの。
とりあえず、このまま話を進めさせていただくことにする。
ちなみに、クライアントエリアへの描画部分についてだが、このソースでは"List002-008"から変更を行っていない。
あっと、忘れてはいけない。
画面描画にあたり、白四角のビットマップをロードしてやる必要があるわけだが、これを関数SetupProcess()と云う名の初期化関数にまとめ、WM_CREATEメッセージで処理していることもつけくわえておこう。
さて、ここで前章までのプログラミングの流れを思い起こして頂きたい。
なにか新機能(新関数)を追加した時には、必ず何かのメッセージ処理として呼出し処理させてきたはずである。
では、今回の新参者、関数MainTransaction()はどこで処理させればよいか?
アプリケーションのコンセプトから考えれば、マウス左クリックで指示した座標へ白四角が到達するまでの間、この関数を繰り返し処理してやる必要がある。
うーむ、色々考えて、今回はdefaultの処理として試してみることにした。
早速、ビルドして実行。
実行結果は左図のとおり。
あれれ?こいつは想像していたものと大分違うぞ??
白四角の辿った軌跡が、先にあげた予定画像と随分雰囲気の違ったものになっている。
それはさて置き、そもそも動きが妙にぎこちない。
なんか書きかけては一服休憩、って状態でなかなか描き上げてくれないのだ。
この現象をよくよく観察していくと、あることに気が付く。
クライアント領域内で意味も無くマウスを振る(?)と、少しずつ、少しずつ描き進めているようなのだ。
さて、この現象の原因は?
実は関数MainTransaction()を呼出した位置、すなわちdefaultにあるのだ。
そもそもメッセージ処理を行う関数MainCallBack()とは、OSが何らかのメッセージをアプリケーションに送る時に、OSから呼出されるものである。
つまり、送るべきメッセージが無いときは、この関数をOSは呼出したりしないのである。
だから、マウスを振った時だけ、関数MainTransaction()は実行されているのだ。
ちなみに、この時OSから送られているのは、WM_MOUSEMOVEメッセージとWM_NCHITTESTメッセージ、WM_SETCURSORメッセージのようである。
つまり、今回のソースは
@白四角の描画位置算出
A描画処理の呼び出し方法
の2点において、失敗作と云うことになる。
なーんだ、今回作ったところ全部ではないか。
・・・・・
気を取り直して、次回はまずAの問題解決から、手をつけてみようと思う。
|