うねる地面 |
地面(壁?)をうねらせるというとひどく難しいことをやろうとしていると思われるかもしれませんが、ただ単にサインカーブに 合わせて1ラインずつ描くだけです。
1.マップチップ |
上のような3つの64×64のマップチップを使います。(a)(b)(c)それぞれについて、幅1ドット、高さ64ドットの画像(今これをライン と呼ぶことにします)に分けて考えます。左から順に0ライン目、1ライン目、……右端が63ライン目です。
2.うねらない場合の描画 |
まず、まったくうねっていない状態を考えます。上の画像は、幅64の同じ画像を並べて描いています。通路の高さは240、上、下の 地面の高さは120としています。
今までと同じ考えで、これをscroll_cnt\64左にずらして描きます。(scroll_cntは今何ドットスクロールしたかを表す変数です。 マップチップの幅が64なので\64となります。)
すると、任意のx座標について、(a)(b)(c)それぞれのマップチップの何ライン目を描けばいいかというと、scroll_cnt\64ずれて
いない状態では
x\64
ライン目です。scroll_cnt\64ずれていますから
(x+(scroll_cnt\64))\64
ライン目です。すると、地面の描画は以下のようになります。
3.上端、下端を求める関数 |
上記は、下の地面の上端のy座標を360、上の地面の下端のy座標を119に固定した場合です。サインカーブに合わせて、任意のx座標 に対する上端、下端のy座標が分かればよいということになります。
高さ、幅をいくらにするか、原点をどこに置くかを決めなければいけません。上下両方の地面ともに、高さを100、幅を480とします。
原点は、原点のx座標を変数sin_oxに入れることにして、下の地面はx座標sin_ox、y座標360の位置とします。上の地面はx座標sin_ox、
y座標119の位置とします。
sin_oxは初期値を480とし、1フレーム毎に減らしていきます。するとサインカーブ全体が左に動いていきます。0になったら480に
戻します。
任意のx座標に対する、上端、下端のy座標を求める関数(ユーザー定義関数)を作ることにします。
(1)下の地面の上端のy座標を求める関数
関数名 Calc_Top_Y
引数 x
戻り値 上端のy座標
(2)上の地面の下端のy座標を求める関数
関数名 Calc_Bottom_Y
引数 x
戻り値 下端のy座標
すると結局、地面の描画は以下のようになります。
(1)下の地面の描画
(2)上の地面の描画
スクロールは1ドット/フレームとします。sin_oxをこれと同じ1ずつ減らしてしまうと、単なるカーブした地面になってしまい、 うねりません。そこで、2ずつ減らすことにします。つまりスクロールよりも1ドット速く動かします。
4.地面との当たり判定 |
自機の中心座標をx、yとします。このxに対応する上の地面の、下端のy座標はCalc_Bottom_Y(x)です。yがこれ以下の時、そこは地面
です。下の地面についても同様で
y<=Calc_Bottom_Y(x) または y>=Calc_Top_Y(x)
の時当たりです。