プレイヤーの操作

プログラミングする部分

前のページで作成した index.html を見てみましょう。
うす青く色付けたところは html で書いています。
色のないところは JavaScript で書いた部分です。
なお CraftyJS を使って描画しています。

地面と背景色を入れたindex.htmlのコード

この講座でプログラミングするのは、色のない部分です。
説明の中でコード全体を表示する時もあれば、一部だけ表示する時があります。
しっかりと説明を読んで、変更するところを間違えないようにしましょう

この処理では次のことをしています。

・Crafty の初期設定
・背景色の設定
・四角の描画(表示座標、サイズ、色の指定)

「何のことやら、さっぱり分かりません」
という人は下の講座からやり直しましょう。

ゲームらしきものをプログラミングしてみよう

 

 

プレイヤーの表示

絵を使ったプレイヤーの表示をしてみます。
重力あり、の左右移動できるように作ります。

次のようにプログラムを変更しましょう。

<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')
        .attr({x:50, y:50})
        .twoway(300)
        .jumper(0)       // ジャンプさせない
        .gravity('Floor');
    // 地面
    Crafty.e('Floor, 2D, Canvas, Color')
        .attr({x:0, y:370, w:500, h:30})
        .color('#a0522d');
</script>

実行するとエイリアンが空中から現れ、地面に着地します。
カーソルキーを使って左右に移動できますが、ジャンプはできません。

重力ありでエイリアンを表示する

 

プログラムは前の講座とほぼ同じです。
仕組みがよく分からないようなら、読み直した方がいいでしょう。

Twoway を使うとカーソルキーで左右に移動、さらに、ジャンプできます。
ただし、jumper(0) でジャンプ力を0にしています。
つまり、ジャンプをキャンセルしています。

スプライト絵の読み込みと、重力あり2方向操作指定

.gravity(‘Floor’);

これを付けることで地面に着地することができます。

 

 

プレイヤーのアニメーション

プレイヤーをアニメーションさせてみましょう。
といっても2枚の絵を交互に表示するだけです。

プレイヤーのみ変更します。

<script>
    // プレイヤー
    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)                // アニメ再生
        .gravity('Floor');
</script>

実行すると、エイリアンが手足をパタパタと動かします。

 

アニメーションに必要な設定は3つです。
SpriteAnimation はアニメーションを使うよ、という宣言です。
reel でアニメの仕様を設定します。
animate でアニメを再生します。

アニメーションに必要な3つの設定

reel(‘walk’,300,0,0,2) の walk は名前です。
好きな名前を付けられます。

300 はアニメの間隔で、単位はミリ秒(ms)です。
ここでは 0.3 秒ごとに絵を切り替えることになります。

0,0 は絵の基点を指定しています。
最後の 2 はアニメの枚数です。
エイリアンの絵をもう一度見てみましょう。

エイリアンの絵

スプライトとして絵を読み込んだ命令をみて下さい。
Crafty.sprite(70,78,“alien2.png”,{alien:[0,0]});

これはエイリアンの絵を 70,78 の枠ごとに使うよ、という宣言もしています。
枠を付けるとこんな感じです。

エイリアンの絵は2つの枠で区切られている

もっと枚数が多ければ分かり易いかもしれません。
また別の機会に説明します。

animate(‘walk’, -1) では、walk というアニメをループ再生させます。
-1 はループの指定です。整数なら再生回数になります。

 

 

プレイヤーの向きを変える

歩いているアニメを付けたので、向きも気になりますよね。
左へ移動している時には、左向きになるようにします。

<script>
    // プレイヤー
    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)                // アニメ再生
        .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");
            }
        })
        .gravity('Floor');
</script>

実行して下さい。左移動の時は左向きになります。
しかし、絵が微妙すぎですね。
しっかり右向きの絵を用意すればよかったと反省してます。

 

追加した部分を見てみましょう。

押されたキーを調べ、絵を反転させる

.bind(‘KeyDown’, function(e) {

キーイベント(押された)が発生したとき function(e) の中を実行します。
e という引数(ひきすう)を付けている点に注意して下さい。

if( e.key == Crafty.keys.LEFT_ARROW ){

e.key には押されたキーのコードが入ってます。
つまり、押されたキーが左キーなら実行します。
右キーかを比較する時には RIGHT_ARROW を使います。

this.flip(“X”);

flip は反転の命令です。
“X” なら左右反転。“Y” なら上下反転になります。
unflip は反転をキャンセルします。

flip の前にある this はちょっと変わっています。
使う所によって値が変化するのです。
今回はエイリアンのオブジェクトの中で使っているので、エイリアン自身の代わりになっています。

 

 

プレイヤーの移動を制限する

プレイヤーを画面外へ出すと戻ってこれません。
外へ出ると地面から落ちてしまうからです。
このような理由がなくてもプレイヤーが見えなくなるのは問題なので、画面外へ出ないようにします。

<script>
    // プレイヤー
    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)                // アニメ再生
        .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");
            }
        })
        .bind('EnterFrame', function () {
            if( this.x < 0 ) this.x = 0;
            if( this.x > 500 - this.w ) this.x = 500 - this.w;
        })
        .gravity('Floor');
</script>

 

4行追加しました。

移動の範囲を制限する

.bind(‘EnterFrame’, function () {

毎フレーム function() の中を実行します。
this.x にはエイリアンのx座標が入っているので、これで判断します。

500 は描画エリアの幅です。
this.w にはエイリアンの幅が入ってます。
エイリアンの幅を引くことで、右画面の外へ出ないようになります。

 

 

『UFOに弾を撃ち込め』

ゲームを作ってみよう

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