1. HOME
  2. »
  3. プログラミング・Web
  4. »
  5. JavaScript
  6. »
  7. enchant.js でキャラクターのアニメーションを作ってみよう

enchant.js でキャラクターのアニメーションを作ってみよう

前回の記事では、キャラが移動する時のアニメーションがありませんでした。
突っ立ったまま進んで行く、まるで幽霊の様な状態です。

これでは、キャラが生きてるのか死んでるのか分からない!
ということで、今回はキャラクターのアニメーションを作ってみましょう!
これでキャラを動かしている感も出てくるのではないでしょうか。

アニメーションでキャラの胸も揺らせ……揺らしません。揺らしたい。。。

前回の記事、HTML5 と javascript ( enchant.js )を使ったアクションゲーム開発。の続きとなっております。

キャラをアニメーションさせてみよう!

前回の記事の内容を覚えているでしょうか。
addEventListener(‘enterframe’, function() {});の中に書かれた内容は、毎フレームごとに呼び出されるんでしたね。
そのことを踏まえ、キャラのアニメーションを作っていきたいと思います。

格好の違うキャラを表示させる

こちらが、前回使用したキャラのグラフィックです。

player

左から、⓪〜③と考えます。

プレイヤー

では、⓪〜③の画像を順番に表示させてみましょう。
addEventListener(‘enterframe’, function() {});の中に、命令を書いていきます。
前回、キャラクターのスプライトをvar playerSprite = new Sprite(51,55);という命令で作りました。
これは51*55の画像で作るという命令なので、画像内ではキャラクターが4つあるにもかかわらず、キャラクターは一番左の画像しか表示されていませんね。

じゃあ左から2番目の画像を表示するにはどうすればいいんでしょうか。
前回作ったソース内に、this.frame = 1;と書き込んでやりましょう。書き込む場所は、playerSprite.addEventListener(‘enterframe’, function() {});の中です。
では、全体のソースを確認してみましょう。

enchant();

window.onload = function() {
	var game = new Game(320,320);
	game.preload('player.png','apad.png');
	game.fps = 15;
	game.onload = function() {
		var playerSprite = new Sprite(51,55);
		playerSprite.x = (game.width/2)-(playerSprite.width/2);
		playerSprite.y = (game.height/2)-(playerSprite.height/2);
		playerSprite.image = game.assets['player.png'];
		game.rootScene.addChild(playerSprite);
		
		var pad = new APad();
		pad.x = 20;
		pad.y = 220;
		game.rootScene.addChild(pad);
		
		playerSprite.addEventListener('enterframe', function() {
			this.frame = 1;
			var speed = 14;
			if (game.input.left) this.x -= speed;
			if (game.input.right) this.x += speed;
			if (game.input.up) this.y -= speed;
			if (game.input.down) this.y += speed;
			
			if (pad.isTouched) {
				this.x += pad.vx * speed;
				this.y += pad.vy * speed;
			}
		});
	}
	game.start();
}

テストプレイ画像

this.frame = 1;のthisというのは、このという意味で、playerSpriteを表しています。
つまり、playerSpriteのフレームが1、つまり左から2番目という意味になります。

じゃあ、②を使いたい場合はどうすればどうすればいいんでしょう。
説明なくても分かるよ!とツッコまれてしまいそうなのですが、一応。

this.frame = 2;に変更してみましょう。すると……

テストプレイ画像

②の画像が表示されました。

順番に表示させてアニメーションだ。

enchant.jsには、スプライトが画面に表示されてからのフレーム数を表すageというものがあります。
読み方は”あげ”。……嘘です。

アニメーションにはこのageを使います。
画面が更新されるごとに、キャラのイラストを変えてやるのです。

フレーム数は、1ずつ増えていきます。
画像は4枚。つまり、フレーム数を4で割った余りをthis.frameに代入すればいいのです。
割った余りを表す%を使いましょう。

this.frame = this.age%4;

これで、フレーム数を4で割った余り、つまり0〜3が、this.frameに代入されます。
しかし、ちょっと待ったっ!!

キャラを思い通りにアニメーションさせてみよう

実はこのイラストは、歩いた時のアニメーションと走った時のアニメーションの2つが合わさったものです。
なので、4枚を順番に表示させても、ちゃんとしたアニメーションはできないのです。

では、キャラが歩いているときは⓪と①を交互に、走っているときは②と③を交互にアニメーションさせるようにプログラムを作り変えていきましょう。

キャラが歩いているときのアニメーションを作る

まず、キャラが歩いているときのアニメーションを作ります。最終的にはアナログパッドを少しだけ傾けた時に歩くという感じに作りたいと思います。
ちなみに私のアナログパッドは常にまっすぐです。(下ネタ

まずは⓪と①の二つのみをアニメーションさせる方法です。
⓪と①のみのアニメーションということは、2枚の画像を交互に表示するということなので、this.ageを2で割った余りを表示するということになります。
この辺は簡単ですね。

this.frame = this.age%2;

となります。

キャラが走っているときのアニメーションを作る

では②と③を交互に表示するにはどうすればいいのでしょうか。
最終的に2枚のアニメーションを交互に表示するということには変わりないので、this.ageを2で割った余りというのは間違いなさそうです。

ではここに2をプラスすると、0〜1 +2= 2〜3となりますね。つまり……

this.frame = this.age%2+2;

とすればいいことになります。

上手くプログラムに組み込んでみよう

このままでは、キャラは常にアニメーションされていることになっています。
これではキャラが疲れてしまいますね。いずれ死んでしまいます。

キャラが移動している時のみアニメーションさせる。

では、実際にプログラムに組み込んでみたいわけですが、歩いている時と、走っている時の区別はどうやってやればいいのと思う人もいるでしょう。
あれ、パッドがどれだけ動いたかという値をとる変数がありましたよね。

まぁとりあえず、キャラが移動している時のみ走らせるプログラムを作ってみましょう。
キャラが移動……つまり方向キーが押されたり、アナログパッドを傾けたりした場合にのみアニメーションさせます。

では先ほどのthis.frame = this.age%2+2;という命令をプログラムに組み込んでみたいと思います。

enchant();

window.onload = function() {
	var game = new Game(320,320);
	game.preload('player.png','apad.png');
	game.fps = 15;
	game.onload = function() {
		var playerSprite = new Sprite(51,55);
		playerSprite.x = (game.width/2)-(playerSprite.width/2);
		playerSprite.y = (game.height/2)-(playerSprite.height/2);
		playerSprite.image = game.assets['player.png'];
		game.rootScene.addChild(playerSprite);
		
		/***アナログパッドの表示***/
		var pad = new APad();
		pad.x = 20;
		pad.y = 220;
		game.rootScene.addChild(pad);
		
		playerSprite.addEventListener('enterframe', function() {
			var speed = 14;
			this.frame = 1;
			
			/***プレイヤーの移動(キー操作)***/
			if (game.input.left) {
				this.x -= speed;
				this.frame = this.age%2+2;
			} if (game.input.right) {
				this.x += speed;
				this.frame = this.age%2+2;
			} if (game.input.up) {
				this.y -= speed;
				this.frame = this.age%2+2;
			} if (game.input.down) {
				this.y += speed;
				this.frame = this.age%2+2;
			}
			
			/***プレイヤーの移動(アナログパッド操作)***/
			if (pad.isTouched) {
				this.x += pad.vx * speed;
				this.y += pad.vy * speed;
				this.frame = this.age%2+2;
			}
			
		});
	}
	game.start();
}

何も操作していないときは、this.frame = 1;で常に①の画像を表示しておきます。
これで移動中のみ走るプログラムができました。

ゆっくり移動しているときは歩くアニメーション

ゆっくり移動させるのは、アナログパッドを少し傾けた時です。キー操作でゆっくり移動させることはできません!てかやりません。多分。
弾幕シューティングじゃないので、ゆっくり移動させる機能をつける必要もないでしょう。

pad.vx や pad.vy は、アナログパッドがどれだけ傾いたという値を表すものです。
アナログパッドの傾きによって、-1〜1までの値が入ります。

また、Math.abs();は、絶対値を返す関数です。
今回は画像が横向きのみなので、横にゆっくり移動している時のみ歩かせるという感じで作っていきましょう。

なので、 pad.vx の値の絶対値が0.5以下の場合、歩かせるというプログラムにしてみましょう。
また、アニメーションの速度も考えて、フレーム数を8で割った時の余りが4以下の場合⓪を表示、それ以外の場合①を表示するというプログラムにしてみましょう。

enchant();

window.onload = function() {
	var game = new Game(320,320);
	game.preload('player.png','apad.png');
	game.fps = 15;
	game.onload = function() {
		var playerSprite = new Sprite(51,55);
		playerSprite.x = (game.width/2)-(playerSprite.width/2);
		playerSprite.y = (game.height/2)-(playerSprite.height/2);
		playerSprite.image = game.assets['player.png'];
		game.rootScene.addChild(playerSprite);
		
		/***アナログパッドの表示***/
		var pad = new APad();
		pad.x = 20;
		pad.y = 220;
		game.rootScene.addChild(pad);
		
		playerSprite.addEventListener('enterframe', function() {
			var speed = 14;
			this.frame = 1;
			
			/***プレイヤーの移動(キー操作)***/
			if (game.input.left) {
				this.x -= speed;
				this.frame = this.age%2+2;
			} if (game.input.right) {
				this.x += speed;
				this.frame = this.age%2+2;
			} if (game.input.up) {
				this.y -= speed;
				this.frame = this.age%2+2;
			} if (game.input.down) {
				this.y += speed;
				this.frame = this.age%2+2;
			}
			
			/***プレイヤーの移動(アナログパッド操作)***/
			if (pad.isTouched) {
				this.x += pad.vx * speed;
				this.y += pad.vy * speed;
				if (Math.abs(pad.vx) < 0.5) {
					if (this.age%8 < 4) this.frame = 0;
					else this.frame = 1;
				} else this.frame = this.age%2+2;
			}
			
		});
	}
	game.start();
}

さて、これでキャラ移動の時のアニメーションが完成しました。
ただ、右左どちらに移動しても同じ向きなので、向きを変えたいのですが、それは次回以降の記事で。

よし、あとは一人でこっそり胸を揺らすアニメーションつくろう……

スポンサードリンク

関連コンテンツ

オススメ記事

【CSS設計】ボタンを作って覚える。機能ごとに分けて作る重要性。

手が回らない、頭が回らない、口が回らない。@It_is_Rです。 CSSはある程度大雑把に書いても動かすことができます。しかし、CSSを覚える上で一番難しい部分と言えばCSS設計でしょう。 パ

WordPress | ツイート数やシェア数付きのSNSシェアボタンを自作しよう!

最近SNSシェアボタンを作り直した@It_is_Rです。 せっかく作ったんだから、シェアするのだよ、みんな。 そこで今回は、Twitter や Facebook、GooglePlus、はてな

リセットCSS は何を使う? 2018年ランキング5選紹介。

世間では年があけたと大騒ぎですが、私はいつでもオープンです。@It_is_Rです。 祝ってください。 Web開発でブラウザごとの表示の違いをリセットしてくれる リセットCSS というものがあり

【Android Studio】TextView を使ってテキストを変更、追加する方法。

TextViewの文字列を変更するより、これまでの人生を変更したい@It_is_Rです。 Android Studioを使ったアプリ開発講座6回目です。 今回はアプリに表示されたテキストを変更

【Gitの使い方 – その4】ブランチを使って履歴を分岐させる方法

エビの殻や、ポテチ、煮干しなどを食べると、必ずと言っていいほど口が血だらけになります。@It_is_Rです。 さて、Gitの使い方4回目の今回は、ブランチについてです。 ブランチは作業を枝分か

【Gitの使い方 – その3】Gitで実際にバージョン管理してみよう!

お魚くわえた@It_is_Rです。 Gitの使い方第3回目の今回は、実際にGitを使ってバージョン管理をしてみようと思います。 [serif name="It is R"]りこ師匠

WordPressカスタムヘッダーを完璧に使いこなしたい人へ告ぐ!

森の中に昔から住んでる@It_is_Rです。 WordPressのカスタマイズをする上で、カスタムヘッダーを使うと、色やヘッダー画像をWordPressの管理画面から操作できるようになり便利です

【Bootstrap 4】badgeを使ってテキスト横に小さな文字を入れる方法

前にBootStrap4の記事を書いていましたが、日にちが空いてしまいましたね。@It_is_Rです。 前回は全体的な機能とアラートの使い方を紹介しました。 今回はバッジの使い方を紹介していき

【Gitの使い方 – その2】GitをMacにインストールする方法!

いらないファイルは残っているのに、欲しいファイルに限って見つからない@It_is_Rです。 Gitの使い方、第2回目の今回はGitをMacにインストールする方法を紹介します。

WordPress|ショートコードの作り方&使い方。確実に使いこなす為のガイド。

前回、WordPressで、特定のカテゴリ一覧を表示する方法について書きました。 改めまして、@It_is_Rです。 特定のカテゴリ一覧を表示したとき、ショートコードというものを使いましたが、

コメントをどうぞ!

メールアドレスが公開されることはありません。