タイトル画面とプレイヤー操作

タイトルとゲームを分けよう

前回作った game.js を解説します。

これまでと違い2つのシーンを登録しています。
タイトルシーンとゲーム中のシーン用です。

title にはタイトル画面としてテキストの一部を表示しています。
main はまだ何もありません。空です。
今回2つのシーンを使うため、前もって用意しました。

titleとmain、2つのシーンを登録している

テキスト表示について下図を見てください。
プログラムで改行していないのに、表示では改行しています。
これはテキストの幅wを小さくしたからです。

テキストの幅を小さくすると自動で開業する

メッセージを表示する枠が固定されている場合など、このやり方が便利だと思います。

 

 

ゲームメインへ導く

プレイヤーの目に留まりやすいように、メッセージを点滅させます。
さらに Z キーを押されたら、シーン main へジャンプさせます。

それではシーン title の処理を変更しましょう。

Crafty.scene("title", function() {
    Crafty.e('2D, DOM, Text').attr({x:100, y:40, w:300})
        .text("ブロックつみつみ").textColor('#00ff7f')
        .textFont({size:'36px', weight:'bold'});
    Crafty.e('2D, DOM, Text').attr({x:150, y:100, w:230})
        .text("タイミングよく Z キーを押して四角をつみ上げてください")
        .textColor('#00ff7f')
        .textFont({size:'14px'});
    Crafty.e('2D, DOM, Text')
        .attr({x:180, y:160, w:300, cnt:0})
        .text("Z キーを押してください").textColor('#ff7f00')
        .bind('KeyDown', function(e) {
            if( e.key == Crafty.keys.Z ) {
                Crafty.scene("main");   // ゲームメイン処理へ
            }
        })
        .bind('EnterFrame', function () {
            this.cnt++;
            if( this.cnt %80 < 50 ){
                this.textColor('#ff7f00');
            } else {
                this.textColor('#333333');            
            }
        })
        .textFont({size:'14px'});
});

 

実行すると、「Z キーを押してください」が点滅します。

変数cntを用意して、毎フレーム、カウントアップしています。
cnt を80で割った余りが50より小さければオレンジ色に変更しています。
それ以外では薄暗い色にしています。

Z キーが押されたときCrafty.scene(“main”)でシーンを切り替えます。
ただシーン main にはまだ何もないため、何も表示されません。

 

 

飾りを表示する

テキストだけのタイトル画面ではあまりにも寂しいので、ブロックの積まれた絵を表示します。

実際にゲームをしたとき、このように積まれることは無いのですが、まぁ、イメージ表示です。

Crafty.scene("title", function() {
    Crafty.e('2D, DOM, Text').attr({x:100, y:40, w:300})
        .text("ブロックつみつみ").textColor('#00ff7f')
        .textFont({size:'36px', weight:'bold'});
    Crafty.e('2D, DOM, Text').attr({x:150, y:100, w:230})
        .text("タイミングよく Z キーを押して四角をつみ上げてください")
        .textColor('#00ff7f')
        .textFont({size:'14px'});
    Crafty.e('2D, DOM, Text')
        .attr({x:180, y:160, w:300, cnt:0})
        .text("Z キーを押してください").textColor('#ff7f00')
        .bind('KeyDown', function(e) {
            if( e.key == Crafty.keys.Z ) {
                Crafty.scene("main");   // ゲームメイン処理へ
            }
        })
        .bind('EnterFrame', function () {
            this.cnt++;
            if( this.cnt %80 < 50 ){
                this.textColor('#ff7f00');
            } else {
                this.textColor('#333333');            
            }
        })
        .textFont({size:'14px'});
    for( let lp=0; lp<6; lp++ ){
        Crafty.e('2D, Canvas, Color')
            .attr({x:150+lp*15, y:350-lp*26, w:200-lp*30, h:25})
            .color(0,250,lp*50);    
    }
});

 

実行すると次のようになります。

ブロックを積んだ絵のあるタイトル画面

これでシーン title は完成とします。

 

 

プレイヤーとブロック(土台)の表示

これからシーンmainを作っていきます。
つまりゲーム中の画面です。

まずはプレイヤーと土台となるブロックを表示します。

Crafty.scene("main", function() {
    // ブロック(土台)
    Crafty.e('Block, 2D, Canvas, Color')
        .attr({x:150, y:350, w:150, h:24})
        .color(0,150,255);
    // プレイヤー
    Crafty.e('Player, 2D, Canvas, Color')
        .attr({x:0, y:30, w:150, h:24, xx:5})
        .color(0,191,255)
        .bind('EnterFrame', function () {
            this.x += this.xx
            if( this.x < 0 ){
                this.x = 0;
                this.xx = -this.xx
            }
            if( this.x > 500 - this.w ){
                this.x = 500 - this.w;
                this.xx = -this.xx            
            }
        });
});

プレイヤーに変数xxを作り、初期値を5にしました。
これは横移動するときの速度になります。

if( this.x < 0 ){
if( this.x > 500 - this.w ){

画面端まで来たときの跳ね返り処理を作っています。

注意したいのが500 - this.wの部分です。
ゲーム中、プレイヤーの幅はどんどん狭くなります。
そのため値を固定せず、現状の幅wを使って毎回計算します。

 

実行すると次のようになります。
プレイヤーは左右に移動を繰り返します。

ゲーム中画面

 

 

プレイヤーを落下させる

Z キーを押したらプレイヤーを落下させます。

プレイヤーのプログラムを変更します。

    // プレイヤー
    Crafty.e('Player, 2D, Canvas, Color')
        .attr({x:0, y:30, w:150, h:24, xx:5, yy:0})
        .color(0,191,255)
        .bind('KeyDown', function(e) {
            if( e.key == Crafty.keys.Z ) {
                if( this.y == 30 ) {    // 初期配置y座標にいるときのみ受け付け
                    this.xx = 0;
                    this.yy = 5;
                }
            }
        })
        .bind('EnterFrame', function () {
            this.x += this.xx
            this.y += this.yy
            if( this.x < 0 ){
                this.x = 0;
                this.xx = -this.xx
            }
            if( this.x > 500 - this.w ){
                this.x = 500 - this.w;
                this.xx = -this.xx            
            }
            if( this.y >= 375 ){    // 画面下まで来た
                this.y = 375;
            }
        });

 

変数yyを作り、初期値を0にしておきます。

.bind(‘KeyDown’, function(e) {
if( e.key == Crafty.keys.Z ) {

ここで Z キーの押下をチェックしています。

if( this.y == 30 ) {

座標y が 30 だったら落下処理をします。
this.xx = 0で横移動を止め
this.yy = 5で落下させます。

 

実行して、適当なタイミングでシフトキーを押してみましょう。
そして、プレイヤーが落下して画面下で止まるのを確認します。

シフトキーを押下するとプレイヤーが落下する

 

 

『ブロックつみつみ』

ゲームを作ってみよう

  1. ブロックつみつみに挑戦
  2. タイトルと操作
  3. ブロックを積み上げる
  4. 演出とゲームオーバー