ヒットとハイスコア

ヒットした回数を表示

UFOに弾を当てた数を、左上に表示します。
回数をカウントするための変数hitを用意します。

<script>
    // カウント変数
    let hit = 0;
    // UFO
    Crafty.sprite(168,76,"UFO.png",{UFO:[0,0]});
    Crafty.e('2D, Canvas, UFO, Collision')
        .bind("EnterFrame", function(){
            this.x += 5;
            if( this.x > 500 ) this.x = -200;
        })
        .attr({x:200, y:50, w:84, h:38})    // 1/2 に縮小する
        .onHit('bullet', function (hitDatas) {  // 弾に当たったら
            for( let i=0, l=hitDatas.length; i<l; i++ ){
                hitDatas[i].obj.destroy();      // 当たったobjを消す
                hit++;
                Crafty("Hit").text("Hit: "+hit);  // ヒット後の表示
            }
        });
    // ヒット数の表示
    Crafty.e("Hit, DOM, 2D, Text")
        .attr({ x:20, y:10, w:280, h:20 })
        .textFont({size:'20px', weight:'bold'})
        .textColor('#a0522d')
        .text("Hit: 0");    // 初期表示
</script>

 

弾を当てるとHit数が変化することを確認しましょう。

ヒット数を左上に表示する

変更点を見てみましょう。

ヒット回数を表示するプログラム

let hit = 0

ヒットした数をカウントするための変数を宣言します。

Crafty(“Hit”).text(“Hit: “+hit)

テキストの枠に表示する文字列をセットしています。
Crafty(“Hit”).text(“ここに表示したい文字”) という感じです。
今回は、“文字列”+変数で1つの文字列を作っています。

Crafty.e(“Hit, DOM, 2D, Text”)

テキスト表示の枠を作ってます。
中にあるHitは、このテキストの名前です。
この名前を使って、別の場所でテキストを変更することも可能です。
例えばhit++の次の行のように使います。

ヒット回数を表示するプログラム

.attr({ x:20, y:10, w:280, h:20 })

表示位置と幅と高さを指定しています。
幅が狭いと改行される場合があります。

.textFont({size:‘20px’, weight:‘bold’})

テキストのサイズなど設定しています。
type や family の設定もできます。

.textColor(’#a0522d’)

フォントの色を設定しています。

 

 

ハイスコアの表示

ヒットした回数はUFOの出現に合わせてリセットするようにします。
回数はハイスコアと比べ大きければ更新します。

ヒット数の表示の下に、ハイスコアの表示を追加します。

<script>
    // ヒット数の表示
    Crafty.e("Hit, DOM, 2D, Text")
        .attr({ x:20, y:10, w:280, h:20 })
        .textFont({size:'20px', weight:'bold'})
        .textColor('#a0522d')
        .text("Hit: 0");
    // ハイスコアの表示
    Crafty.e("Hiscore, DOM, 2D, Text")
        .attr({ x:220, y:10, w:280, h:20 })
        .textFont({size:'20px', weight:'bold'})
        .textColor('#a0522d')
        .text("HI-SCORE: 0");
</script>

 

内容はヒット表示と同じです。
実行すると次のようになります。

画面上部にハイスコアの表示が出る

 

 

ハイスコアの書き換え

ハイスコアよりもヒット回数が多い場合、スコアを更新します。
専用の変数hiScoreを用意します。

変数の追加とUFOのプログラムを変更します。

<script>
    // カウント変数
    let hit = 0;
    let hiScore = 0;
    // UFO
    Crafty.sprite(168,76,"UFO.png",{UFO:[0,0]});
    Crafty.e('2D, Canvas, UFO, Collision')
        .bind("EnterFrame", function(){
            this.x += 4;
            if( this.x > 600 ){
                this.x = -200;
                if( hit > hiScore ){
                    hiScore = hit;
                    Crafty("Hiscore").text("HI-SCORE: "+hiScore);
                }
                hit = 0;
                Crafty("Hit").text("Hit: 0");
            }
        })
        .attr({x:200, y:50, w:84, h:38})    // 1/2 に縮小する
        .onHit('bullet', function (hitDatas) {  // 弾に当たったら
            for( let i=0, l=hitDatas.length; i<l; i++ ){
                hitDatas[i].obj.destroy();      // 当たったobjを消す
                hit++;
                Crafty("Hit").text("Hit: "+hit);  // ヒット後の表示
            }
        });
</script>

 

変更点を見てみましょう。

ハイスコアを更新するプログラム

let hiScore = 0

ハイスコアを入れるための変数を宣言します。

if( hit > hiScore ){

ヒット数がハイスコアより大きいか判断しています。
大きいとき、ヒット数をハイスコア変数に代入します。

Crafty(“Hiscore”).text(“HI-SCORE: “+hiScore)

ハイスコアを表示しています。
Hiscore はテキストの枠の名前です。

 

ハイスコアの更新とは別にUFOが再出現するタイミングで
ヒット数のリセットを行います。

ハイスコアの更新とヒットのリセット

微妙に調整したところもあります。

this.x += 4

UFOの移動速度を5から4へ変更しました。
移動速度を遅くしたことで、ハイスコアの上限が広がります。

if( this.x > 600 ){

500から600に変更しました。
UFOが画面に表示されない時間を長くしました。
心を落ち着かせる時間も必要かと思ったからです。
ここら辺は開発者のさじ加減ですね。

 

 

完成です

これで完成です。お疲れさまでした。

プログラミングの学習は続けることで身に付きます。
できれば毎日のようにやれたらいいですね。

 

今回の全プログラムです。

<script>
    Crafty.init(500,400, document.getElementById('game'));
    Crafty.background('#f0fff0');
    // プレイヤー
    Crafty.sprite(70,78,"alien2.png",{alien:[0,0]});
    Crafty.e('2D, Canvas, alien, Gravity, Twoway, SpriteAnimation')
        .attr({x:50, y:50})
        .twoway(300)
        .jumper(0)                          // ジャンプさせない
        .reel('walk',300,0,0,2)             // アニメ設定
        .animate('walk', -1)                // アニメ再生
        .origin(35, 0)                      // 中心点のオフセットを指定
        .bind('KeyDown', function(e) {
            if( e.key == Crafty.keys.LEFT_ARROW ){
                this.flip("X");             // 絵をx軸反転させる
            }
            if( e.key == Crafty.keys.RIGHT_ARROW ){
                this.unflip("X");
            }
            if( e.key == Crafty.keys.Z ) {  // 弾を発射
                Crafty.e("2D, Canvas, Color, bullet")       // 弾を作成
                    .attr({x:this.ox, y:this.oy,w:5, h:10})   // alien の座標を代入
                    .color("rgb(255, 0, 0)")
                    .bind("EnterFrame", function() {
                    this.y -= 5;
                    if( this.y < -20 ) {
                        this.destroy();     // 弾を消す
                    }
                });
            }
        })
        .bind('EnterFrame', function () {
            if( this.x < 0 ) this.x = 0;
            if( this.x > 500 - this.w ) this.x = 500 - this.w;
        })
        .gravity('Floor');
    // 地面
    Crafty.e('Floor, 2D, Canvas, Color')
        .attr({x:0, y:370, w:500, h:30})
        .color('#a0522d');
    // カウント変数
    let hit = 0;
    let hiScore = 0;
    // UFO
    Crafty.sprite(168,76,"UFO.png",{UFO:[0,0]});
    Crafty.e('2D, Canvas, UFO, Collision')
        .bind("EnterFrame", function(){
            this.x += 4;
            if( this.x > 600 ){
                this.x = -200;
                if( hit > hiScore ){
                    hiScore = hit;
                    Crafty("Hiscore").text("HI-SCORE: "+hiScore);
                }
                hit = 0;
                Crafty("Hit").text("Hit: 0");
            }
        })
        .attr({x:200, y:50, w:84, h:38})    // 1/2 に縮小する
        .onHit('bullet', function (hitDatas) {  // 弾に当たったら
            for( let i=0, l=hitDatas.length; i<l; i++ ){
                hitDatas[i].obj.destroy();      // 当たったobjを消す
                hit++;
                Crafty("Hit").text("Hit: "+hit);
            }
        });
    // ヒット数の表示
    Crafty.e("Hit, DOM, 2D, Text")
        .attr({ x:20, y:10, w:280, h:20 })
        .textFont({size:'20px', weight:'bold'})
        .textColor('#a0522d')
        .text("Hit: 0");
    // ハイスコアの表示
    Crafty.e("Hiscore, DOM, 2D, Text")
        .attr({ x:220, y:10, w:280, h:20 })
        .textFont({size:'20px', weight:'bold'})
        .textColor('#a0522d')
        .text("HI-SCORE: 0");
</script>

 

 

『UFOに弾を撃ち込め』

ゲームを作ってみよう

  1. また始めよう
  2. プレイヤーの操作
  3. 弾とUFO
  4. ヒットとハイスコア