デフォルトから一本のゲームを完成させる8.背景のループの仕組みを考える
前回ではスクロールで流れる背景を作った。
しかしこのままでは、画像1枚で流れてしまう。
画像が永久に流れるようにしたい。
そこで画像がループする仕組みを考えてみよう。
色々方法はあるかも知れないが、私が考えたのは、以下のやり方。
まず背景画像を2枚用意する。
1枚は画面にすっぽりと表示し、2枚めはその上にピッタリと付けて置く。
そして2枚とも下に同時に動かす(スクロールさせる)
1枚めが画面下に見切れていくほど、2枚めは画面上からせり入っていく形。
そして、1枚めが完全に見えなくなってしまった時…(2枚めの全体がすっぽりと表示された時でもある)
1枚めはすぐさま2枚めの後ろへ移動する(初めに2枚めが居た位置だ)
同様に2枚めにも、この処理を行う。2枚めが画面下から出たら、また画面上に戻る。
1枚目は画面内におり、再びその上にぴったりと付く形。
この仕組みを導入すれば無事、背景が途切れる事なく流れ続けるのではないだろうか。
さっそくこの方法を試してみたい…だが背景が2枚だからといって、
// 1枚め this.back1 = tm.app.Sprite("BACK"); this.back1.origin = tm.geom.Vector2(0.0, 0.0); this.back1.scroll_move = function(){ this.y += userData.speed; } this.addChild(this.back1); // 2枚め this.back2 = tm.app.Sprite("BACK"); // ..省略 this.addChild(this.back2);
みたいに、同じ文が続くのはまた、スマートではない。
ならばmakeLabelみたいな作成する関数を作る…? と言いたい所だが、そもそも今回は、それぞれが独立して動くラベルとは違う。
今回は"画像こそ2枚並べるが、その2枚で一つの背景"…という位置づけだ。
画像としてはそれぞれ Sprite で表示するが、実際には2つをまとめて処理しないと、背景ループと呼べる処理にならない。
こうした場合は、2つの変数を一つの"配列"にしてまとめてると、処理しやすく、見た目に関係性も分かってスマートになる。
という訳で少し回り道して、"配列"というものを勉強しよう。