配列変数を使った地形との当たり判定 |
今、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文字目とする)。