配列変数を使った地形との当たり判定

当たり判定

 今、32×32ドットの壁(当たり判定がある地形)が並んだ、単純な地形を考えます(背景も32×32ドットの矩形が並んでいるもの とします)。画面の大きさは幅640、高さ480で、ゲーム画面は480×480、右横の残りの部分をスコア表示部とします。

 地形の配置データは、壁を1、背景を0で表した、次のような単純なものであるとします。

map(63)="1,0,0,0,0,0,0,0,0,0,0,0,0,0,1"
	・
	・
	・
map( 4)="1,0,0,0,0,0,0,0,0,0,0,0,0,0,1"
map( 3)="1,1,0,0,0,0,0,0,0,0,0,0,0,1,1"
map( 2)="1,1,1,0,0,0,0,0,0,0,0,0,1,1,1"
map( 1)="1,1,1,1,0,0,0,0,0,0,0,1,1,1,1"
map( 0)="1,1,1,1,1,0,0,0,0,0,1,1,1,1,1"

 各要素が1列分のデータで、480/32=15個の数字が並んでいます。

 上の画像は配列変数の以下の部分に対応しています。

map(22)="1,0,0,0,0,0,0,0,0,1,1,1,1,1,1"
map(21)="1,0,0,0,0,0,0,0,0,1,1,1,1,1,1"
map(20)="1,1,1,1,1,1,0,0,0,1,1,1,1,1,1"
map(19)="1,1,1,1,1,1,0,0,0,1,1,1,1,1,1"
map(18)="1,1,1,1,1,1,0,0,0,1,1,1,1,1,1"
map(17)="1,1,1,1,1,1,0,0,0,1,1,1,1,1,1"
map(16)="1,1,1,1,1,1,0,0,0,1,1,1,1,1,1"
map(15)="1,1,1,1,1,1,0,0,0,1,1,1,1,1,1"
map(14)="1,0,0,0,0,0,0,0,0,0,0,0,0,0,1"
map(13)="1,0,0,0,0,0,0,0,0,0,0,0,0,0,1"
map(12)="1,0,0,0,0,0,0,0,0,0,0,0,0,0,1"
map(11)="1,0,0,0,0,0,0,0,0,0,0,0,0,0,1"
map(10)="1,0,0,0,0,0,0,0,0,0,0,0,0,0,1"
map( 9)="1,0,0,0,0,0,0,0,0,0,0,0,0,0,1"
map( 8)="1,0,0,0,0,0,0,0,0,0,0,0,0,0,1"

 自機の中心座標にのみ当たり判定があるものとします。
 普通に考えると、すべての壁と、自機との当たり判定を行わなければなりません。壁は最大で15*15=225個にもなります(その場合 自機の通り道がなくなりますが)。自機だけならいいですが、自機の弾、敵の弾と地形との当たり判定も考えると1フレームあたり 相当な量の当たり判定を行うことになり、速度的にちょっと心配です。

 上の画像で、自機の中心座標はどこにあるかというと、左端を0列目として7列目、やはり上端を0行目として6行目にあります。
 ということは、8+7=15でmap(15)の6番目(最初を0番目とする)の値を調べれば、1であれば当たり、0であれば当たっていないと、 即座に判断することができます。

 1.地形の描画

 ステージが始まってから何ドットスクロールしたかを変数scroll_cntに入れることにします。すると、何番の要素から描き始めれば いいかというと、scroll_cntが0の時は左端の列はmap(0)、32の時はmap(1)、……256の時はmap(8)、つまり添え字がscroll_cnt/32の要素 から描き始めればよいということになります。

 scroll_cntが32の倍数ではない時にはどうかというと、例えば258の場合は256の時の絵を2ドット左にずらせばいいのです。つまり  scroll_cnt\32ドットずらします(\は「余り」です)。すると画面の右の方が空いてしまいますから、1列多く描きます。つまり16列 描きます。
 ということは
  n=(scroll_cnt/32)の整数値(小数点以下を切り捨てた値)
 とすると、map(n)〜map(n+15)のデータを読んで、scroll_cnt\32左にずらした位置に描けばよいということになります。

 値が1のところに壁の、値が0のところに背景のマップチップを描きます。

 2.地形との当たり判定

 左端の列は配列mapの(scroll_cnt/32)の整数値番目の要素に対応しています。

 自機の座標をmyship_x、myship_y、大きさを32×32とすると、自機の中心座標は
  x=myship_x+16
  y=myship_y+16
 です。

 左端の列の左端のx座標は、-(scroll_cnt\32)です。ということは、そこから自機の中心座標は
  x+(scroll_cnt\32)
 離れています。

 よって、左端の列から数えて
  ((x+(scroll_cnt\32))/32)の整数値
 列目にあります。

 配列mapの該当する要素の
  (y/32)の整数値
 番目の値を見ればよいということになります。カンマも含めて数えると、
  (y/32)の整数値*2
 文字目です(最初を0文字目とする)。


[サンプルプログラムをダウンロード]

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