地面と壁のスクロール

おさらい

これからの作業はgame.jsのプログラムを変更していきます。

まずは作成時のプログラムを見てみましょう。
すべてこれまでに使われた方法で作られています。

Crafty.sceneの登録と呼び出し

ブロック崩しのリトライ処理でCrafty.sceneを使いました。
このゲームもリトライさせるので入れています。

プレイヤーの属性を簡単に説明します。

Twowayは左右の移動とジャンプを可能にします。
Gravityは重力を付けます。
gravity(‘Ground’)でオブジェクトの Ground を地面として設定します。

その他の分からないことは以前のページを参照して下さい。

 

 

ジャンプ力とアニメーションの設定

ジャンプをすると画面を突き抜けて見えなくなります。
ジャンプ力を弱める設定をしましょう。
ついでに歩きアニメーションも入れます。

変更はプレイヤーの色を付けた行です。

    // プレイヤー
    Crafty.sprite(70,78,"alien2.png",{Alien:[0,0]});
    Crafty.e('Alien, 2D, Canvas, Twoway, Gravity, SpriteAnimation')
        .attr({x:50, y:50})
        .twoway(300, 300)       // 移動速度, jump力
        .reel('walk',300,[[0,0],[1,0]])
        .animate('walk', -1)
        .gravity('Ground');

SpriteAnimation

アニメーションを有効にします。

.twoway(300, 300)

twoway(300) とすると移動速度とジャンプ力の両方に使われます。
twoway(300, 300) のように2つに分けると、移動とジャンプそれぞれに設定されます。
試しに twoway(300, 100) で実行してみて下さい。
ジャンプの高さがちょっとだけになります。
(テスト後は数値を戻しましょう)

.reel(‘walk’,300,[[0,0],[1,0]])

アニメーションの絵の切り替え設定です。
walk は私が勝手に付けた名前です。
300 は切り替え間隔です。単位はミリ秒。
[[0,0],[1,0]]は切り替える絵の場所です。これは今までと違う指定方法です。

今回は、並べられた絵の場所を直接指定しています。
複数登録された絵は sprite 作成時の幅、高さをもとに区切られ、
[x,y]の形で指定できるのです。

アニメの絵の指定

例えば下図のように並べられた絵で、a b c の順番でアニメーションさせたいのであれば reel(‘walk’,300,[[1,0],[0,2],[0,1]]) と設定します。

アニメさせる絵の場所を指定する方法

.animate(‘walk’, -1)

アニメーション名 walk を再生します。
-1 はループ再生です。

 

 

地面のスクロール

地面をスクロールさせます。
と言っても、別のオブジェクトを表示してスクロールしているように見せるだけです。

色の付いた行を追加します。

    // 地面
    Crafty.e('Ground, 2D, Canvas, Color')
        .attr({x:0, y:250, w:500, h:50})
        .bind("EnterFrame", function(){
            if( Crafty.frame() %40 == 0 ){
                // 地中の四角
                Crafty.e('2D, Canvas, Color')
                    .attr({x:500, y:this.y, w:20, h:this.h})
                    .color('#a0826c')
                    .bind("EnterFrame", function(){
                        this.x -= 4;
                        if( this.x < 50 ){
                            this.destroy();
                        }
                    });
            }
        })
        .color('#a0522d');

とりあえず実行してみましょう。

地面の中にある四角が右から出現し、印のところで消えるか確認します。

地面の中の四角が途中で消えることを確認する

確認したらthis.x < 50this.x < -30に変更します。
これで画面の左へ移動し終わってからオブジェクトが消滅します。

なぜこのような確認が必要かというと、消滅処理に失敗していた場合、やがてプログラムが正常に動かなくなるからです。
できるだけ見える場所で正常に動くか確認するようにしましょう。

 

プログラムについてです。

if( Crafty.frame() %40 == 0 ){

Crafty.frame() はただの実行カウンターです。
40フレームに一回、地中の四角を作成することになります。

.attr({x:500, y:this.y, w:20, h:this.h})

地面のy座標 this.y と高さ this.h を引き継いでいます。
今回は変更しませんが、もし、地面の位置や高さ(厚さ)を変更してもそれに対応して作られます。

 

 

壁の発生

壁を作ります。
発生と移動のしくみは、地中の四角とほぼ同じです。

変数wallCntを作って、壁の発生タイミングに使います。

    let wallCnt = 100;          // 壁発生タイミングカウント
    // 地面
    Crafty.e('Ground, 2D, Canvas, Color')
        .attr({x:0, y:250, w:500, h:50})
        .bind("EnterFrame", function(){
            if( Crafty.frame() %40 == 0 ){
                // 地中の四角
                Crafty.e('2D, Canvas, Color')
                    .attr({x:500, y:this.y, w:20, h:this.h})
                    .color('#a0826c')
                    .bind("EnterFrame", function(){
                        this.x -= 4;
                        if( this.x < -30 ){
                            this.destroy();
                        }
                    });
            }
            if( Crafty.frame() > wallCnt ) setWall();
        })
        .color('#a0522d');
    // 壁
    function setWall(){
        const hh = Crafty.math.randomInt(40, 85);   // 壁の高さ
        wallCnt += Crafty.math.randomInt(25, 100);  // 次の発生タイミング
        Crafty.e('Wall, 2D, Canvas, Color')
            .attr({x:500, y:250-hh, w:40, h:hh})
            .color('#ffa500')
            .bind("EnterFrame", function(){
                this.x -= 4;
                if( this.x < -50 ){
                    this.destroy();
                }
            });
    }

 

実行してみましょう。
高さの違う壁がスクロールしてくるようになりました。

壁を発生しスクロールさせる

if( Crafty.frame() > wallCnt ) setWall();

変数 wallCnt よりも実行カウンターが大きくなったら壁を発生させます。
wallCnt の初期値は 100 にしたので 100フレーム後に1つ目の壁が出てきます。

wallCnt += Crafty.math.randomInt(25, 100);

乱数を作り(25から100までの間)壁の発生タイミングとしています。

.attr({x:500, y:250-hh, w:40, h:hh})

地面の位置(y:250)から乱数で決めた壁の高さを引いて、壁を作ります。

this.x -= 4;

壁の移動速度です。
これは地面の中の四角と同じ速さにすることでスクロールしているように見せます。

 

 

『壁を飛び越せ』

ゲームを作ってみよう

  1. 壁を飛び越せに挑戦
  2. 地面と壁のスクロール
  3. 当たりとGAMEOVER
  4. スコアとリトライ