蛇型キャラ

 ゲームによく、蛇や竜みたいなキャラが出て来ますね。要するに複数のパーツがつながっている長いキャラクターです。今回はこれを作る方法について考えます。グラディウスのような自機の動きに追従するオプションを作りたい場合や、誘導レーザーを作りたい場合にも応用が効くと思います。

蛇型キャラ

 1.移動の履歴

 今、頭部つまり先頭のパーツの動きを他のパーツにトレースさせたいとします。すると、頭部が1回移動するたびにその座標を記憶しておき、他のパーツもその通りに動かせばいいということになります。ここでは座標の他に角度も記憶しておくことにします。各パーツを傾けて表示しないのであれば角度はいりません。

 移動の履歴をとっておく配列変数をhistory_x,history_y,history_angleとします。それぞれX座標、Y座標、角度です。頭部の現在の位置、角度がhistory_x.0,history_y.0,history_angle.0です。1回前がhistory_x.1,history_y.1,history_angle.1、2回前がhistory_x.2,history_y.2,history_angle.2です。

 例えば今、蛇型キャラが初期位置にいる時、各パーツが横にまっすぐに並んでいるものとします。パーツ同士の距離は48ドットで、1回に4ドット移動するとします。すると2番目のパーツが今いる場所は、頭部が12回前にいた場所です。つまりhistory_x.12,history_y.12,history_angle.12を2番目のパーツの位置、角度に設定すればよいということになります。3番目なら24回前、4番目なら36回前です。例えばパーツが全部で8個あるとすると、配列に必要な要素数は7*12+1=85となります。

 2.初期位置の設定

 初期位置は、画面の右上隅のすぐ外に横にまっすぐ並んでいるものとします。画面のサイズは640*480で、各パーツの大きさは64*64とします。

初期位置

 配列変数snake_x,snake_y,snake_angleに各パーツの中心の座標、角度を入れます。0番の要素が頭部で、それ以降が胴です。パーツを傾けた時にパーツ同士が離れて見えたら嫌なので、パーツ間の距離は48ドットとします。つまり一部分を重ね合わせるわけです。すると、n番目の要素の初期位置は
  snake_x.n=640+32+(48*n)
  snake_y.n=32
  snake_angle.n=0
 となります(X軸のマイナス方向を0度とした場合です)。

 履歴の変数にも初期設定が必要ですから、右の方からずっと左に4ドットずつ進んできて初期位置に着いたものとします。履歴のn番目の要素は
  history_x.n=640+32+(4*n)
  history_y.n=32
  history_angle.n=0
 となります。

 3.移動

 頭部以外のパーツは、新たな位置に移動する時に履歴を参照します。頭部を0番として、n番目のパーツの現在の座標、角度が履歴のn*12番目の要素を参照しているのですから、次はn*12-1番目の要素です。
  m=n*12-1
  snake_x.n=history_x.m
  snake_y.n=history_y.m
  snake_angle.n=history_angle.m

 全パーツを移動させたら、履歴を更新しなければいけません。履歴の各要素を1つずつ後ろにずらします(history_x.0の内容をhistory_x.1に、history_x.1の内容をhistory_x.2に、といった具合)。そして、移動後の頭部の位置、角度をhistory_x.0,history_y.0,history_angle.0に入れます。

 これで、頭部を自分の動かしたいように動かせば、全体がそれに追従して動く、というわけです。


[サンプルプログラムをダウンロード] (HSP Ver2.61+hspext.dll+hmm.dll用)
[サンプルプログラムをダウンロード] (HSP Ver3用)
 蛇型キャラがマウスカーソルを追いかけます。追いつくと止まります。

[目次へ][前へ][次へ] inserted by FC2 system