大人気のHTML5+JavaScriptベースのゲームエンジン「enchant.js」を使ってゲームアプリを作る方法を解説していく連載。今回は、手軽にアニメーションを作れるtl.enchant.jsの使い方や、スマホ向けアニメーションのチューニングポイント6つを解説する。
前回の「enchant.jsで重要なスプライトとシーンを使うには」では、ゲームの流れとなる部分を駆け足で解説いたしました。
今回は、よりゲームをリッチに見せる、複雑なアニメーションの作り方を理解していきましょう。この機能を使うと、こんなもの(サンプル)を簡単に作ることができます。ぜひ「JavaScriptとは思えない!」ようなゲームを目指しましょう。
なお、今回のサンプルはenchant.jsのバージョン0.6.3を利用しています。もしもバージョン0.5.2以前のものを使う場合は、enchant.jsをダウンロードしたフォルダの中にある「plugins」フォルダから「tl.enchant.js」を取り出し、読み込んでおく必要があります。なお、バージョン0.6.0からは本体のライブラリと統合されていますので、特に読み込む必要はありません。
任意の場所 └ index.html……中身は空のテキストファイル └ フォルダ「js」 └ main.js ……中身は空のテキストファイル └フォルダ「lib」 └ enchant.js ……ダウンロードしたenchant.js本体 └ tl.enchant.js ……enchant.jsに同梱されているpluginsフォルダの中からコピーしておく └ フォルダ「img」 └ 画像など
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>カードが踊るサンプル</title> <meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no"> <script src="./js/lib/enchant.js"></script> <script src="./js/lib/tl.enchant.js"></script> <script src="./js/main.js"></script> ……
「tl.enchant.js」とは、かつてアニメーションを表現するためにenchant.jsのプラグインとして開発されていた「animation.enchant.js」が本家に取り込まれたもので、enchant.jsのバージョン0.6.0から標準で使えるようになった機能です。これを使うと、従来の手作業によるアニメーションの記述を大幅に削減できます。
例えば、次のような動きを表現しようとします。
今までの方法で書くと、次のようなプログラムになります。
enchant(); window.onload = function() { var game_ = new Game(320, 320); // 表示領域の大きさを設定 game_.fps = 24; // ゲームの進行スピードを設定 game_.preload('./img/chara1.png'); // ゲームに使う素材をあらかじめ読み込み game_.onload = function() { // ゲームの準備が整ったらメインの処理を実行します var kuma = new Sprite(32, 32); kuma.image = game_.assets['./img/chara1.png']; kuma.frame = 4; // スケボーに乗ったくまを表示させる kuma.x = 144; //くまの初期位置設定 kuma.y = 0; // くまの初期位置設定 game_.rootScene.backgroundColor = '#ffffff'; // 背景色 game_.rootScene.addChild(kuma); // シーンにくまを追加 var vectol_x = 1; // くまのx進行方向フラグ(1で右、0で左) var vectol_y = 1; // くまのy進行方向フラグ(1で下、0で上) // 毎フレームイベントを追加 game_.rootScene.addEventListener(Event.ENTER_FRAME, function(){ // くまをジグザグ移動させる if (vectol_y == 1) { // x進行方向フラグが下なら if (vectol_x == 0) { // x進行方向フラグが左なら kuma.x --; // くまを左に移動 if (kuma.x < 114) { // くまがある程度左に移動したら kuma.x = 114; vectol_x = 1; // x進行方向を逆転させる } } else { // x進行方向フラグが右(左以外)なら kuma.x ++; // くまを右に移動 if (kuma.x > 174) { // くまがある程度右に移動したら kuma.x = 174; vectol_x = 0; // x進行方向を逆転させる } } kuma.y ++; // くまを下方向に移動 if (kuma.y > 240) { // くまがある程度下に移動したら kuma.y = 240; vectol_y = 0; // y進行方向を逆転させる } } else { // y進行方向フラグが上(下以外)なら kuma.y -= 10; // くまを上方向に素早く移動させる if (kuma.y < 0) { // ある程度くまが上に移動したら kuma.y = 0; vectol_y = 1; // y進行方向を逆転させる } } }); } game_.start(); // ゲームをスタートさせます }
このプログラムでは、毎フレーム処理の中にif文を織り交ぜて、現在のキャラクターの位置を基に進行方向を決定し、キャラクターの座標に加減算をすることによりアニメーションを表現しています。
このように、少しでも複雑なアニメーションを行おうとすると、プログラムが煩雑になり、一見して分かりづらくなってしまいます。このようなプログラムだと、途中の動きを変えたり、一部分だけスピードを変えるといった微調整を行うのも一苦労です。
そこで、tl.enchant.jsを使ってみましょう。
上述のプログラムを新しい方法で書き直してみたのが、以下のコードです。
enchant(); window.onload = function() { var game_ = new Game(320, 320); // 表示領域の大きさを設定 game_.fps = 24; // ゲームの進行スピードを設定 game_.preload('./img/chara1.png'); // ゲームに使う素材をあらかじめ読み込み game_.onload = function() { // ゲームの準備が整ったらメインの処理を実行します var kuma = new Sprite(32, 32); kuma.image = game_.assets['./img/chara1.png']; kuma.frame = 4; // スケボーに乗ったくまを表示させる kuma.x = 144; //くまの初期位置設定 kuma.y = 0; // くまの初期位置設定 game_.rootScene.backgroundColor = '#ffffff'; // 背景色 game_.rootScene.addChild(kuma); // シーンにくまを追加 // くまがジグザグに移動するアニメーションを登録する kuma.tl.moveTo(174, 30, 30); // ?x=174, y=30の地点まで30フレームかけて移動させる kuma.tl.moveTo(114, 90, 60); // ?x=114, y=90の地点まで60フレームかけて移動させる kuma.tl.moveTo(174, 150, 60); // ?x=174, y=150の地点まで60フレームかけて移動させる kuma.tl.moveTo(114, 210, 60); // ?x=114, y=210の地点まで60フレームかけて移動させる kuma.tl.moveTo(144, 240, 30); // ?x=144, y=240の地点まで30フレームかけて移動させる kuma.tl.moveTo(144, 0, 24); // ?x=144, y=0の地点まで24フレームかけて移動させる kuma.tl.loop(); // 全て終わったら初めから繰り返す } game_.start(); // ゲームをスタートさせます }
どうでしょうか、非常にすっきりと書けていると思います。このように、tl.enchant.jsを使うと、簡単にアニメーションを作成し、つなげていくことができます。
動かしたいものにアニメーションを登録すると、直ちにアニメーションが開始されます。さらに、アニメーションはいくつでも登録でき、先に登録されたものから順番にアニメーションが行われます。アニメーションの種類は移動、回転、拡大縮小、フェードイン・アウトが用意されており、個別で使う他にも、組み合わせて使えます(後述)。
注意点として、tl.enchant.jsを使って動かしたいものにアニメーションを登録すると、動かしたいもの自体に自動的に毎フレーム処理が登録されます。そのため、間違って自前で用意した毎フレーム処理の中にアニメーションを登録してしまうと、1秒の間に何十件もアニメーションが登録され続けることになってしまい、いつまでも終わらなくなってしまいます。
// これは誤り // 1秒間に何十件もアニメーションが登録され続けてしまいます game_.rootScene.addEventListener(Event.ENTER_FRAME, function(){ // くまがジグザグに移動するアニメーションを登録する kuma.tl.moveTo(174, 30, 30); // ?x=174, y=30の地点まで30フレームかけて移動させる kuma.tl.moveTo(114, 90, 60); // ?x=114, y=90の地点まで60フレームかけて移動させる kuma.tl.moveTo(174, 150, 60); // ?x=174, y=150の地点まで60フレームかけて移動させる kuma.tl.moveTo(114, 210, 60); // ?x=114, y=210の地点まで60フレームかけて移動させる kuma.tl.moveTo(144, 240, 30); // ?x=144, y=240の地点まで30フレームかけて移動させる kuma.tl.moveTo(144, 0, 24); // ?x=144, y=0の地点まで24フレームかけて移動させる kuma.tl.loop(); // 全て終わったら初めから繰り返す });
tl.enchant.jsを使うときはアニメーションを「登録」していくものだと考え、自前の毎フレーム処理の中に書かないように気を付けましょう。
Copyright © ITmedia, Inc. All Rights Reserved.