強火で進め

このブログではプログラム関連の記事を中心に書いてます。

キャラクターアニメーションの方法


今回のサンプル
サンプルの全ファイル
今回は enchant.js に付属の action-skelton フォルダのサンプルを使います。

このサンプルはクマが左から右へ移動するサンプルですがアニメーションは付いていません。こちらにアニメーションを付ける方法を解説します。

enchant.js でのアニメーションの仕組み

enchant.js ではこの様な縦横のサイズが60x30の画像が有った場合に

Sprite を20x30で作成( var bear = new Sprite(20, 30); )すると60x30の元画像は
以下の様に20x30に分割されます。

そして、frameの値が増える毎に左から右に使われる画像が移動して行きます。一番右まで移動した後は最初の位置に戻ります。

アニメーションのプログラムを追加

サンプルフォルダに有る game.js を開いて下さい。中身はこの様に成っているかと思います。

enchant();

window.onload = function() {
    var game = new Game(320, 320);
    game.preload('bear.gif');
    game.onload = function() {
        var bear = new Sprite(20, 30);
        bear.image = game.assets['bear.gif'];
        bear.addEventListener('enterframe', function() {
            this.x += 3;
        });
        game.rootScene.addChild(bear);
    };
    game.start();
};

アニメーションは移動の処理を行なっているのと同じ enterframe イベントで行うのが良いでしょう。
このイベントで this(ここでは bear に対応) の frame の値を加算させ、アニメーションさせましょう

以下の様に this.x += 3; の次の行に this.frame++; を追加しましょう。

        bear.addEventListener('enterframe', function() {
            this.x += 3;
            this.frame++;
        });

変更後のプログラムを動作させると確かにアニメーションはするのですがアニメーションが速すぎるかと思います。

現在の様に毎フレームアニメーションを切り替える方法では速すぎなので何回かに1回だけ frame を加算する(アニメーションを進める)様に変更します。プログラムはこの様に成ります。

        bear.animeWaitMax = 3;		// アニメーションのWait値
        bear.animeWaitCount = 0;	// アニメーションのWait値のカウント
        bear.addEventListener('enterframe', function() {
            this.x += 3;
            if (this.animeWaitCount >= this.animeWaitMax) {
            	this.animeWaitCount = 0;
            	this.frame++;
            } else {
            	this.animeWaitCount++;
            }
        });

animeWaitMax が何回に1回 frame を加算する(アニメーションを進める)かを指定します。今回は3と成っているので3フレームに1回アニメーションが進みます。

丁度良い感じのアニメーションに成ったかと思います。キャラクターの移動速度により、最適なアニメーションの速度は異なります。
あくまで今回の値はこの移動速度に合うアニメーション速度となります。その為、実際にゲームを作成する時にはキャラクターの移動速度に応じてWaitの値は調整する様にして下さい。

関連情報

nakamura001 @ ウィキ - トップページ/JavaScriptゲーム/ライブラリ/enchant.js/サンプル
http://www32.atwiki.jp/nakamura001/pages/149.html