こんにちは。CTOのづやです。
最近のサイトはぐいんぐいんと動いてたりしますよね。私も負けずにぐいんぐいん動かしたいなと思っていたのですが、素で書くにはなかなか難易度が高そうです。
そんなとき、弊社のエンジニア・ハカセがPixi.jsというライブラリを教えてくれました。Canvasライブラリの中では最速とのこと。
そこで今回は、そのPixi.jsを初めて触って簡単にアニメーションを作成してみた話を紹介したいと思います。
- Pixi.js
Pixi.jsの基本
まずは公式サイトのダウンロードボタンを押し、遷移先のGitHubよりコードを落としてきます。
- GitHub
https://github.com/GoodBoyDigital/pixi.js
ダウンロードした中の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サイト制作を支援しています。ご興味のある方は事業ぺージをぜひご覧ください。