第18章 タコと豆腐の交代
2006年11月29日
さて先日、ソニ○からP○3なるコンシューマー向けゲーム機が発売され、世間ではちょっとした盛り上がりをみせているようだ。
来月には、ニンテンド○からW○iなるマシンも発売され、クリスマス商戦、年始お年玉争奪戦に向け、各社しのぎを削っている様子が、さまざまなメディアから報じられている。
私はと云えば、○ガ製ドリ○ムキャストを導入していらいまったく購買意欲を失ってしまって、P○2すら持っていない現状なわけだが、しかし、コンシューマ機に対する興味が無くなってしまった訳ではない。
それぞれのハードウェアに対する情報を(素人なりに)集め、ふむふむと(素人なりに)分析し、知的欲求をみたして満足しているのである。
しかし、Ce○lは素晴らしいねぇ。
いやぁ、能力が、と云うより、その構成の発想が。
○BMの面目約如ってところか、懐が深くてプログラミングの面白みに溢れているみたい(プロのプログラマーの方はご苦労様です)。
その上、今後のCPU開発コストも製造コストも抑えることが出来そうな構成だ。
P○3本体の構成にしても、メモリ容量きつめでプログラマーの腕の見せ所と云うか、ぬるいPCアマグラマーには想像を絶するテクニックが駆使されていくに違いない。
なにせPCでは、遅いマシンは置いてけぼり、ってはっきり宣言できてしまうのだから。
ただ、P○2に比べて(外観はともかく)ソニ○色が薄くなってしまった感が否めず、少し残念な気がする。
対するW○iも負けてはいない。
絶対的な処理能力はさておき、(プログラマーに限らず)開発者の発想力を刺激する様々な工夫が光る、素晴らしいマシンだと思った。
どちらにしても、○BMにとっておいしい商戦になっている事実は、さすが、と評するべきなのだろう。
しかし、ああ、この連載もどんどんゲーム色が濃くなってしまったなぁ。
ま、担当者の嗜好なのだから仕方ないにしても・・・
さて、前回までの内容を踏まえた上で、キャラクター表示について研究してみよう。
ただ、今回は前哨戦。
次回からの展開に向けての下準備ということで、特に新しいことはしないので、さくさくっと進めてみようと思う。
これはただ単にマージするBMPデータを置き換えただけだ。
特に説明することもないのだが、判りやすいように変数名を少し変更した。
以下が、実行結果と、差し替えたBMPファイルの拡大図である。

さぁ、次は背景を描画してみよう。
こちらもさくさくっと・・・
ここではまず、関数SetBackGround()と関数BildBackGround()を用意し、関数SetupProcess()で背景用のBMPファイルを読み込んで、関数SetupGraphics()で描画している。

ああ、ちょっとさくっと行き過ぎた。
背景の描画方法は、画面いっぱいに関数SetCharacter()を実行しているだけ。
これを関数SetupGraphics()の最後で呼び出すことにより、仮想デバイスコンテキストを背景画像で埋めているわけだ。
ここで気をつけなければならないのは、関数SetBackGround()と関数BildBackGround()の呼び出し順序。
関数MainCallBack()のWM_CREATEメッセージ処理において、関数SetupProcess()の後で関数SetupGraphics()を呼び出しているが、この順番を入れ替えると背景の描画に失敗してしまう。
はい、次っ!!
今度は背景を描画するタイミングを変更してみよう。
さて、何をどうしたのかと云うと、List002−018で関数SetupGraphics()の最後で呼び出していた関数BildBackGround()を、関数BildClientarea()の最後で呼び出すように変更した点だ。
こうすることで、クライアントエリアを描き換えるたびに仮想デバイスコンテキストは背景画像で埋め尽くされる。
結果は以下のとおり。
タコ君(?)は線を引きずることなく、クライアント領域内を移動してくれる。
少し尾っぽ(?)が付いているのは、ご愛嬌(?)。
理屈は、タコ君の描画した後を背景画像で毎回塗りつぶしているからなのだが、移動の為だけに背景を全て描き換えるのは、ホントはあまり褒められたやり方ではない。
本来ならば、タコ君の移動前の領域だけ背景を重ねてやればその分処理が軽くなるわけだが、以降の展開であることを企んでいるため、また、現代の高速なPCの処理能力をもってして、今はあえてこの方法をとることにしよう。
さて、ここまで準備を進めたうえで、次回はキャラクターと背景の重ね合わせ処理を研究してみよう。
なお、描画に使用しているBMPファイルのセンスの悪さは、コーディングのセンスの悪さとあわせて、広い心を持って勘弁していただきたい。
|