横スクロールの途中で縦スクロールする

 横スクロールの途中で自機は横を向いたまま縦スクロールに変わり、また横スクロールに戻るアルゴリズムについて考えます。

 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)
  • 変数areaを0とします
  • 地形の描画、地形との当たり判定は前回の講座とまったく同じです。
  • scroll_cntが33*32になったら
     area=1
     scroll_cnt=1
    とします。
途中の縦スクロール地帯(エリア1)
  • 向きが違うだけで、エリア0と同様のアルゴリズムです。
  • 地形の描画
    下端の行に対応する配列mapの行番号は(scroll_cnt/32)の整数値です。
    そこから上に向かって16行分、scroll_cnt\32ドット下にずらして描きます。
  • 地形との当たり判定
    自機の中心座標をx、yとします。
    下端の行に対応する配列mapの行番号は(scroll_cnt/32)の整数値です。
    そこから((479-y+(scroll_cnt\32))/32)の整数値行目の要素を見ます。
    (x/32)の整数値*2文字目が1であれば当たりです。
  • scroll_cntが33*32になったら
     area=2
     scroll_cnt=1
    とします。
最後の横スクロール地帯(エリア2)
  • 地形の描画、地形との当たり判定は前回の講座とまったく同じです。

 同じ要領で敵も出せます。


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

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