敵キャラクタが動くようになった。編隊を組むところまで。以下、暇潰しに実装レベルの話を少々。前二作にも共通しているのだが、敵キャラクタの動作には“方位テーブル”ととりあえず呼ぶところの手法を使っている。キャラクタの位置は画面上の縦座標、横座標の2つの値で管理されていて、例えば縦座標の値を現在の値に対していくつか足してやると、その値の分だけキャラクタは下方向へ移動する、という関係がある。ゲーム中のキャラクタを動かす、というのは、この縦・横座標の値を、何らかのルールに従って足したり引いたりすることだ、と言い換えることが出来る。方位テーブルというのは、この縦・横座標の二次元値にそれぞれ足したり引いたりする移動量を、別の一次元単位である“方位”で管理する手法をいう。<方位テーブルの例>上に示したのは、移動量8ピクセルのときの方位テーブルの例になる。中央の赤い●が基準点(キャラクタの元の位置)であり、上下左右にそれぞれ9ピクセルの範囲を示している。緑色の枡が基準点からの縦・横座標それぞれの移動量を示し、そこに書かれた値がここでいう方位になる。ことだ、ということがわかる。<プログラム中ではこのように表現される>本作は32方位を採用している(ゼビモドキ、ドラコニックスロウンは16方位だった)ので、32方位×(縦+横の移動量)=計64バイトでもって、この方位テーブルを定義することが出来る。MOVTBL8)に方位×2バイトを加えれば、方位に対応した移動量を知ることができる。先の方位8の例で言えば、8×2=先頭から16バイト目(赤字部分)に、確かに縦0、横8の移動量が示されていることがわかる。拙Weblogの熱心な読者であれば、上掲ソースコードの冗長な64バイトはこちらの方針に反しているのでは、と思われるかも知れない......んなヤツいないよな......が、これは別に事情があってやっていることなのであしからず。ちなみに本作中にはこのテーブルが敵キャラクタの6段階の速度変化に応じて用意されているのだが、ソースコードに上掲のように書かれているのは3種のみで、残り3段階はROMに含まれる3種から演算で導かれるようになっていて、この点においては方針は貫徹されているのだ、エッヘン。こんな面倒なことをするのだろう。縦・横座標に足し算・引き算を直接すればいいじゃないか。ここにはいくつかの理由がある。第一の理由は、曲線的な移動が表現しやすくなる点だ。冒頭動画で、画面右から登場した敵キャラクタはプレイヤーの背後で半円を描いてから編隊へと合流していくが、この半円を描く挙動は、移動毎(厳密には意図した旋回半径を得るべく、フレームレートをいくつか数える毎)に方位を1ずつ加える(あるいは引く)ことのみによって実現されている。同じことを直接の足し算・引き算でおこなうことは、不可能ではないが著しく効率が悪い(厳密に言えば曲線種毎に専用のロジックを必要とし、ゼビモドキの高速放物線飛行する敵機はこの方法を採っている)。逆に、方位テーブルを使うと、方位の増減をコントロールすることで、半円のみならず真円、楕円、蛇行の軌道を、やはり足し算・引き算の組み合わせのみで得ることができる。第二の理由として、プレイヤー位置と相関する敵キャラクタ移動ロジックが作り易くなる、というのがある。実は最大の理由として、方位テーブルは、ターゲットするオブジェクト(つまりプレイヤー)が自分(敵キャラクタ)から見てどこにいるのかを把握する都合もあって採用しているものなのだが、その詳細の説明は割愛し、とにかく、敵からみてプレイヤーがどの方位にいるかが0〜31の値でわかったとして、ここから様々な応用を試みることができる。単純な利用は、その方位に向かって移動すればプレイヤーに体当たりできる、というものだが、この方位をフレームレート毎に更新すれば、延々とプレイヤーを追跡するキャラクタになる。数フレームレート毎に最新のプレイヤー方位を得た上で、現在の方位を上書きするのではなく、最新の方位に近づくように加減算するようにしてやると、プレイヤーを蛇行軌道を描きながら追跡するホーミングミサイルのような動きを表現できる。察しの良い人はお気づきかと思うが、ドラコニックスロウンの魔法使いの誘導弾がまさにこれである。位置にプレイヤーがいるとして、そこへ向かう方位(実線)をまず得る。これに直交する方位(本作の32方位であれば8を加えるか引いた)を得てこれを移動方向に用いるとどうなるか。そのキャラクタはプレイヤーの周囲を周回することになる。ゼビモドキの裏切り者がこれをやっている(左図黒線)。8ではなく7を加えたり引いたりする(左図赤線)とどうなるか。周回方向でありながら僅かにプレイヤーに対して接近することになるので、結果、このキャラクタは渦を描きながらプレイヤーに飛び込んでいくことになる。いった具合に、方位テーブルはいろいろと役立つゲームプログラミングテクニックなのである。現代的なゲームプログラミングにおいては、以上のようなことは大抵出来合いのベクトル操作系のライブラリに既に組み込み済みであって、プログラマが上に書いたようなことを意識しなければならないことはまずない。そのライブラリとてアセンブラレベルまで降りていけば、やっていることの基本原理は本稿に書いたことそのまま、あるいはそのスケールアップ版である。何が言いたかったかというと、見た目は地味だが、その地味さの裏に、こういうやはり地味なロジックの積み重ねがあるんだよ、ということを偉そうに言ってみたかっただけ。コメント(0)トラックバック(この記事にリンクしている関連ページ)一覧トラックバックURLトラックバック一覧とは、この記事にリンクしている関連ページの一覧です。あなたの記事をここに掲載したいときは、「記事を投稿してこのページにお知らせする」ボタンを押して記事を投稿するか(AutoPageを持っている方のみ)、記事の投稿のときに上のトラックバックURLを送信して投稿してください。0:00プレイヤーの攻撃を実装した。繰り返し言っているように、『佛陀斬』は往年のNAMCOのギャラガやギャプラスのようなフォーメーションシューティングの亜種としてデザインされているのだが、プレイヤーの主攻撃手段は剣戟になっている。“AutoPage”AutoPage最新お知らせ。