横スクロールの途中で縦スクロールする |
横スクロールの途中で自機は横を向いたまま縦スクロールに変わり、また横スクロールに戻るアルゴリズムについて考えます。
1.地形の配置データ |
地形の配列変数をmapとし、map(0)〜map(47)を最初の横スクロール地帯とします。
上の画像は最初の横スクロール地帯の最後に来たところです。赤い枠で囲んでいるのが最後の画面です。次に縦スクロールに移行します。
そのままmap(48)、map(49)、……と追加していけばよさそうですが、それだと問題があります。向きが違うのです。
そこでステージを最初の横スクロール地帯(エリア0)、途中の縦スクロール地帯(エリア1)、最後の横スクロール地帯(エリア2)
の3つのエリアに分けます。すると配列mapは
map(エリア番号, 列(行)番号)
という2次元配列になります。
ここでは、配置データはmap(0,0)〜map(0,47)、map(1,0)〜map(1,47)、map(2,0)〜map(2,47)からなるものとします。
エリア0の最後の画面はエリア1の最初の画面でもあり
map(0,47)="0,0,0,0,0,0,0,0,0,0,0,0,0,0,1" map(0,46)="0,0,0,0,0,0,0,0,0,0,0,0,0,0,1" map(0,45)="0,0,0,0,0,0,0,0,0,0,0,0,0,0,1" map(0,44)="0,0,0,1,1,0,0,0,0,1,1,0,0,0,1" map(0,43)="0,0,0,1,1,0,0,0,0,1,1,0,0,0,1" map(0,42)="0,0,0,1,1,0,0,0,0,1,1,0,0,0,1" map(0,41)="0,0,0,0,0,0,0,0,0,0,0,0,0,0,1" map(0,40)="0,0,0,0,0,0,0,0,0,0,0,0,0,0,1" map(0,39)="0,0,0,0,0,0,0,0,0,0,0,0,0,0,1" map(0,38)="0,0,0,1,1,0,0,0,0,1,1,0,0,0,1" map(0,37)="0,0,0,1,1,0,0,0,0,1,1,0,0,0,1" map(0,36)="0,0,0,1,1,0,0,0,0,1,1,0,0,0,1" map(0,35)="0,0,0,0,0,0,0,0,0,0,0,0,0,0,1" map(0,34)="0,0,0,0,0,0,0,0,0,0,0,0,0,0,1" map(0,33)="0,0,0,0,0,0,0,0,0,0,0,0,0,0,1" map(1,14)="0,0,0,0,0,0,0,0,0,0,0,0,0,0,0" map(1,13)="0,0,0,0,0,0,0,0,0,0,0,0,0,0,0" map(1,12)="0,0,0,0,0,0,0,0,0,0,0,0,0,0,0" map(1,11)="0,0,0,1,1,1,0,0,0,1,1,1,0,0,0" map(1,10)="0,0,0,1,1,1,0,0,0,1,1,1,0,0,0" map(1, 9)="0,0,0,0,0,0,0,0,0,0,0,0,0,0,0" map(1, 8)="0,0,0,0,0,0,0,0,0,0,0,0,0,0,0" map(1, 7)="0,0,0,0,0,0,0,0,0,0,0,0,0,0,0" map(1, 6)="0,0,0,0,0,0,0,0,0,0,0,0,0,0,0" map(1, 5)="0,0,0,1,1,1,0,0,0,1,1,1,0,0,0" map(1, 4)="0,0,0,1,1,1,0,0,0,1,1,1,0,0,0" map(1, 3)="0,0,0,0,0,0,0,0,0,0,0,0,0,0,0" map(1, 2)="0,0,0,0,0,0,0,0,0,0,0,0,0,0,0" map(1, 1)="0,0,0,0,0,0,0,0,0,0,0,0,0,0,0" map(1, 0)="1,1,1,1,1,1,1,1,1,1,1,1,1,1,1"
というふうにデータを二重に持つことにします。
エリア1からエリア2に切り替わる部分についても同様です。
2.地形の描画、地形との当たり判定 |
エリア0の最後に来た時、scroll_cntは33*32=1056になっています。そのままscroll_cntを増やしていくこともできそうですが、 考え方がややこしくなります。そこでシンプルに、scroll_cntが1056になったらscroll_cntを0に戻してしまいます。
と、したいところですが、その場合エリア0のscroll_cntが1056の時と、エリア1のscroll_cntが0の時とで、2フレーム同じ絵を 描いてしまうことになります。そこで、scroll_cntを0ではなく1にします。
最初の横スクロール地帯(エリア0) |
|
途中の縦スクロール地帯(エリア1) |
|
最後の横スクロール地帯(エリア2) |
|
同じ要領で敵も出せます。