jsc_040

JavaScript のゲームプログラミング入門

4. 絵を動かしてみよう

 

ここで、CraftyJS の書き方のルールを少し説明します。
前々回のプログラムを見てください。

    Crafty.init(500,400, document.getElementById('game'));
    Crafty.background('#87ceeb');
    Crafty.e('2D, Canvas, Color, Twoway, Gravity')
        .attr({x:220, y:50, w:50, h:50}).color('#f00')
        .gravity('Floor')
        .twoway(200);
    Crafty.e('Floor, 2D, Canvas, Color')
        .attr({x:50, y:360, w:400, h:20}).color('#00f');

セミコロン ; が付いている行と無いところがありますね。
すでに気づいていると思いますが、Crafty と ; はセットになっています

ですから、次のように書いてもOKです。

        Crafty
            .init(500,400, document.getElementById('game'));
        Crafty
            .background('#87ceeb');
        Crafty
            .e('2D, Canvas, Color, Twoway, Gravity')
            .attr({x:220, y:50, w:50, h:50})
            .color('#f00')
            .gravity('Floor')
            .twoway(200);
        Crafty
            .e('Floor, 2D, Canvas, Color')
            .attr({x:50, y:360, w:400, h:20})
            .color('#00f');

こう書いてもOKです。

        Crafty.init(500,400, document.getElementById('game'));
        Crafty.background('#87ceeb');
        Crafty.e('2D, Canvas, Color, Twoway, Gravity').attr({x:220, y:50, w:50, h:50})
            .color('#f00').gravity('Floor').twoway(200);
        Crafty.e('Floor, 2D, Canvas, Color').attr({x:50, y:360, w:400, h:20}).color('#00f');

私は見やすさを優先します。
でも、縦に長くなりすぎると思ったとき、つなげて書くこともあります。

 

 

絵をダウンロードしよう

これからの作業には絵が必要です。
つぎの3つの絵をダウンロードしてください。

 

【 idle.png 】 キャラクター待ち

【 walk.png 】 キャラクター歩き

【 all.png 】 キャラクターすべて

 

 

ダウンロードの方法は、絵の上で右クリックしてメニューを出します。
つぎに「名前を付けて画像を保存」をクリックするとダウンロードできます。
ファイルの保存場所を尋ねられたときは、保存場所を選択して [保存] をクリックします。

画像をダウンロードする方法

 

ダウンロードした3つの画像は作業フォルダに入れましょう。
フォルダの中は次のようになります。

ダウンロードした画像を作業フォルダに入れる

 

なお、この絵は Kenney さんのところからダウンロードしたものです。
ここにはゲームで使える多くの素材が配布されてます。(有料・無料あります)
かわいい絵がたくさんありますよ。

[ Kenney asset ]

 

 

絵を表示しよう

ダウンロードした絵を表示してみましょう。

画像は idle.png を使います。
キャラクターがただ立っている絵ですね。
ついでに地面の色も変更します。

        Crafty.init(500,400, document.getElementById('game'));
        Crafty.background('#87ceeb');
        // 待ちの絵
        Crafty.sprite(96,96,"idle.png",{player:[0,0]});
        Crafty.e('2D, Canvas, player, Twoway, Gravity')
            .attr({x:220, y:50})
            .gravity('Floor')
            .twoway(200);
        Crafty.e('Floor, 2D, Canvas, Color')
            .attr({x:50, y:360, w:400, h:20}).color('#830');

 

実行してみます。
地面の色が目にやさしくなりました。
以前、四角だったものをキャラクターに変えただけなので、移動やジャンプもできます。

キャラクターの絵を入れる

 

画像を表示するにはスプライト sprite を使います。
使い方は色々ですが、とりあえず1枚絵のパターンを紹介します。

        Crafty.sprite(96,96,"idle.png",{player:[0,0]});

96,96 は画像の切り出しサイズ(幅と高さ)です。
“idle.png” は読み込むファイル名、
player はこのスプライトの名前(任意)です。
[0,0] は切り出しの場所を指定します。後ほど詳しくやります。

 

四角から画像に変更するには Crafty.e を変えます。
Color は必要ないので削除し、スプライトの player を組み込みます。

(変更前)   Crafty.e('2D, Canvas, Color, Twoway, Gravity')

(変更後)   Crafty.e('2D, Canvas, player, Twoway, Gravity')

 

色の指定も必要ないので color を削除します。

(削除)   .color('#f00')

 

四角ではサイズ w,h を指定しましたがこれも削除します。
削除した場合、スプライトの切り出しサイズが使われます。

(変更前)   .attr({x:220, y:50, w:50, h:50})

(変更後)   .attr({x:220, y:50})

 

 

歩くアニメーションをさせよう

先ほどは、ただ立っている絵だったので、歩くアニメを入れます。

        Crafty.init(500,400, document.getElementById('game'));
        Crafty.background('#87ceeb');
        // 歩きの絵
        Crafty.sprite(96,96,"walk.png",{player:[0,0]});
        Crafty.e('2D, Canvas, player, Twoway, Gravity, SpriteAnimation')
            .attr({x:220, y:50})
            .reel('walk',300,0,0,2)     // アニメ設定
            .animate('walk', -1)        // アニメ再生
            .gravity('Floor')
            .twoway(200);
        Crafty.e('Floor, 2D, Canvas, Color')
            .attr({x:50, y:360, w:400, h:20}).color('#830');

実行すると、ぱたぱたと歩くアニメーションになります。

歩きのアニメーションを入れる

 

 

画像ファイルを walk.png に変更しました。

        Crafty.sprite(96,96,"walk.png",{player:[0,0]});

 

アニメーションさせるために SpriteAnimation を追加します。

        Crafty.e('2D, Canvas, player, Twoway, Gravity, SpriteAnimation')

 

アニメの設定に reel を使います。
まず名前(任意)を付けます。 walk としました。
300 はアニメーションの長さで、単位はミリ秒(ms)です。
0,0 は絵の基点を指定していて、最後の 2 はアニメの枚数です。

            .reel('walk',300,0,0,2)     // アニメ設定

0,0 の基点は画像の左側を示しています。
切り出しサイズは sprite で設定した 96,96 で行われます。

spriteの設定で絵が切り出される

 

アニメを再生するには animate を使います。
アニメの名前と再生回数を指定します。-1 でループ再生します。

            .animate('walk', -1)        // アニメ再生

 

簡単にアニメーションできましたね。
この方法はシンプルですが、絵を順番に並べる必要があります。
色々な絵を並べた all.png を使うやり方は、また後で紹介します。

 

 

絵の向きを変えよう

キー操作でプレイヤーを歩かせるとき、絵の向きを変えます。

仕組みは player の表示処理の中に入れます。
player の処理のみ表示しています。注意してください。

        Crafty.e('2D, Canvas, player, Twoway, Gravity, SpriteAnimation')
            .attr({x:220, y:50})
            .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')
            .twoway(200);

 

実行すると、歩く方向へ向きを変えます。

 

キーが押されたか調べるために bind を使います。
これはイベントを受け取るとき(何かが起こったとき)に使う方法です。
KeyDown を指定することで、キーが押されたとき function の中の処理を実行できます。
function(e) と書くことで e でイベント情報を受け取ることができます。

            .bind('KeyDown', function(e) {
                // キーが押されたとき、ここが実行される
            }

 

押されたキーが左矢印キーかどうかを調べています。
e.key には押されたキーの内容、Crafty.keys.LEFT_ARROW は左矢印キーのコードが入ってます。

                if( e.key == Crafty.keys.LEFT_ARROW ){
                    this.flip("X");     // 絵をx軸反転させる
                }

this.flip(“X”) はx軸で絵を反転させます。“Y” とすればy軸で反転します。
this. はちょっと特殊で、この場合は player そのものを指しています。だから、player の絵が反転するのです。
this について詳しく知りたいのであればjavascript thisで検索してみてください。

 

if 文は条件分岐をするときに使います。
(条件が であれば { } の中の処理をします)
イコールを2つ == 並べることで、左右が同じ値かを判断します。
つまり e.key の値が Crafty.keys.LEFT_ARROW と同じであれば を返します。

    if( 条件式 ){
        条件式が成り立ったとき ( 真のとき ) 処理を実行する
    }

追加した2つの if 文は、
左矢印キーが押されたとき、絵を左向きに反転させ
右矢印キーが押されたとき、絵の反転を無効にしています。
絵はもともと右を向いているので、右向きになります。

 

色々と書きましたが、しっかり理解しなくてもいいです。
if 文はプログラミングで必ず使います。だから嫌でも覚えることになりますよ。
分からないことがあっても焦る必要はありません。