Pixi.jsを初めて触って簡単にアニメーションを作成してみた話(その1)

Pixi.jsを初めて触って簡単にアニメーションを作成してみた話(その1)

Kazuya Takato

Kazuya Takato

こんにちは。CTOのづやです。
最近のサイトはぐいんぐいんと動いてたりしますよね。私も負けずにぐいんぐいん動かしたいなと思っていたのですが、素で書くにはなかなか難易度が高そうです。

そんなとき、弊社のエンジニア・ハカセがPixi.jsというライブラリを教えてくれました。Canvasライブラリの中では最速とのこと。
そこで今回は、そのPixi.jsを初めて触って簡単にアニメーションを作成してみた話を紹介したいと思います。

  • Pixi.js

Pixi.jsの基本

まずは公式サイトのダウンロードボタンを押し、遷移先のGitHubよりコードを落としてきます。

  • GitHub

ダウンロードした中のexamplesフォルダの中には、サンプルがたくさんあります。
1つ目のサンプルを見てみましょう。

動物がくるくるまわっております。

script部分は以下のような感じになってました。

// create an new instance of a pixi stage
var stage = new PIXI.Stage(0x66FF99);

// create a renderer instance
var renderer = PIXI.autoDetectRenderer(400, 300);

// add the renderer view element to the DOM
document.body.appendChild(renderer.view);

requestAnimFrame(animate);

// create a texture from an image path
var texture = PIXI.Texture.fromImage("bunny.png");

// create a new Sprite using the texture
var bunny = new PIXI.Sprite(texture);

// center the sprites anchor point
bunny.anchor.x = 0.5;
bunny.anchor.y = 0.5;

// move the sprite to the center of the screen
bunny.position.x = 200;
bunny.position.y = 150;

stage.addChild(bunny);

function animate() {
    requestAnimFrame(animate);

    // just for fun, let's rotate mr rabbit a little
    bunny.rotation += 0.1;

    // render the stage
    renderer.render(stage);
}

ざっくり言えば、ステージとレンダリング用のエリアを作って画像を配置し、画像の角度をちょっとずつ変えてるみたいなことでしょうか。

Pixi.jsでアニメーションを作成する

先ほどのサンプルのコードを参考に、とりあえず自分でコメントをつけながら書いてみました。以下ご参照ください。

window.addEventListener('load', function(){

	// 使う変数を指定
	var isScaleUp = true;
	var WIDTH = 640 , // ステージの横幅
	HEIGHT = 640 , // ステージの高さ
	SCALE_CHANGE_NUMBER = 0.05 , // アニメーション1回単位で変化させるスケール
	SCALE_UP_LIMIT = 0.8 , // 最大のスケール
	SCALE_DOWN_LIMIT = 0.2; // 最少のスケール

	// ステージを作ります。引数で背景色が渡せます
	var stage = new PIXI.Stage(0xff00ff);

	// 横幅と高さを指定してステージを作ります
	var renderer = PIXI.autoDetectRenderer(WIDTH , HEIGHT);

	// 描画エリアをbodyに追加します。
	document.body.appendChild(renderer.view);

	// アニメーションフレームで「animet」関数を呼びます
	requestAnimFrame(animate);

	// 画像パスからテクスチャを作成します。
	var texture = PIXI.Texture.fromImage("img/taka.jpg");

	// テクスチャをもったスプライトを作成します。
	var sprite = new PIXI.Sprite(texture);

	// 回転する点を中心にします。(デフォルトは1,1で左上)
	sprite.anchor.x = 0.5;
	sprite.anchor.y = 0.5;

	// スプライトをセンターに配置します。
	sprite.position.x = 320;
	sprite.position.y = 320;

	// スケールを半分にする
	sprite.scale = new PIXI.Point(0.5 , 0.5);

	// ステージにテクスチャを追加します。
	stage.addChild(sprite);

	/**
	 * アニメーション用の関数
	 */
	function animate() {
		// 1回しか呼ばれないので、もう1回自分を呼びます。そうやって永遠に動き続けます
	    requestAnimFrame(animate);

	    // 角度に0.1を追加します。
	    sprite.rotation += 0.1;

	    // あまりにもサンプルのままなので、スケールも変化させてみる
	    var nowScale = bunny.scale ,
	    pointX = nowScale.x,
	    pointY = nowScale.y;

	    // スケールをアップしていったりダウンしていったりさせる
	    if(isScaleUp) {
	    	pointX += SCALE_CHANGE_NUMBER;
	    	pointY += SCALE_CHANGE_NUMBER;

	    	if(pointX > SCALE_UP_LIMIT) {
		    	pointX = SCALE_UP_LIMIT - SCALE_CHANGE_NUMBER;
		    	pointY = SCALE_UP_LIMIT - SCALE_CHANGE_NUMBER;
		    	isScaleUp = false;
	    	}

	    } else {
	    	pointX -= SCALE_CHANGE_NUMBER;
	    	pointY -= SCALE_CHANGE_NUMBER;

	    	if(pointX < SCALE_DOWN_LIMIT) {
		    	pointX = SCALE_DOWN_LIMIT + SCALE_CHANGE_NUMBER;
		    	pointY = SCALE_DOWN_LIMIT + SCALE_CHANGE_NUMBER;
		    	isScaleUp = true;
	    	}
	    }

	    // 新しいスケールの値を設定
	    sprite.scale = new PIXI.Point(pointX , pointY);

	    // render the stage
	    renderer.render(stage);
	}
});

さいごに

いかがでしたでしょうか。今回自分で書いて、なんとなく感覚がつかめた気がしますので、次回以降もうちょっと試していきたいと思います。

みなさんもぜひチャレンジしてみてください。それでは、また。

LIGはWebサイト制作を支援しています。ご興味のある方は事業ぺージをぜひご覧ください。

Webサイト制作の実績・料金を見る

この記事のシェア数

Kazuya Takato
Kazuya Takato 取締役 COO 兼 CTO / DX事業本部長 / 高遠 和也

1983年生まれ。SIerとしてのキャリアをスタートし、JavaやC#を中心に多岐にわたる開発プロジェクトにエンジニアとして参加。その経験を活かし、LIGを創業。バックエンドおよびフロントエンドエンジニアとしての深い知識と経験をもとに、多様なプロジェクトに従事。現在は、取締役COO兼CTO、DX事業本部長として、社内の体制やルールの最適化、AI技術の推進など、経営戦略の一翼を担う。

このメンバーの記事をもっと読む
デザイン力×グローバルな開発体制でDXをトータル支援
お問い合わせ 会社概要DL