2018秋の無料相談会
2018秋の無料相談会
2018.06.19

Pixi.jsでCanvasをカンタンに触ってみよう! 〜パーティクル編〜

はやち

どうもですよ、はやちですよ٩( ᐛ )و
以前、こちらの記事でご紹介したPixi.js。


今回はパーティクルを使用して、ちょいと「雪が降ってる風」の演出を実装する方法をご紹介します( ˇωˇ)☝

導入方法

npmはこちらからインストールしてお使いください。
npm install pixi.js

実装方法

それでは実装方法ご紹介します( ˘ω˘)☞三☞シュッシュッ

土台の設定

はじめに表示するCanvasを用意します。
Canvasはサイズと背景色も設定できます( ˇωˇ)☝

let app = new PIXI.Application(800,600,{backgroundColor : 0x1099bb});
document.body.appendChild(app.view);

複製させる画像の数を決めておきます( ˇωˇ)☝

//表示をする画像の数
let totalSprites = 100;

パーティクルの設定をします。
引数に表示をする画像の数、アニメーションさせるオプションを設定します( ˇωˇ)☝

let sprites = new PIXI.particles.ParticleContainer(totalSprites, {
scale: true,
position: true
});

設定したものをステージに反映( ˇωˇ)☝

app.stage.addChild(sprites);

複数の画像を表示する設定

複数の画像を表示させるための配列をつくるために空の箱を用意。

let hayachi = [];

表示する分の回数をループして画像と、画像の中心地を設定。

//画像分をtotalSprites回数分ループ
for (let i = 0; i < totalSprites; i++){
// 画像の設定
let dude = PIXI.Sprite.fromImage('http://hayachi.github.io/images/hayachi-blue.png');

// 画像の中心地をきめる
dude.anchor.set(0.5);

画像のサイズをランダムに決める。

dude.scale.set(0.01 + Math.random() * 0.1);

画像の位置をランダムに散らす。

dude.x = Math.random() * app.screen.width;
dude.y = Math.random() * app.screen.height;

速度をランダムに設定します。

dude.speed = (200 + Math.random() * 0.5) * 0.5;

はじめに用意した変数に格納します。

hayachi.push(dude);

ループのデータを反映します。

sprites.addChild(dude);
}

アニメーションの設定

アニメーションの初期値値を設定。

let tick = 0;

アニメーションでステージの高さをとるために設定。

const HEIGHT = 620;

画像のアニメーションの設定。

app.ticker.add(function() {

画像を繰り返し処理して位置を更新しているなかで、ステージ内で上から下まで通った後に縦の位置をリセット、横の位置をランダムに配置します。

for (let i = 0; i < hayachi.length; i++) {
//配列を代入
let dude = hayachi[i] ;
//横の位置
dude.x += (Math.random() - 0.5) * 1 * dude.scale.x;
//縦の位置
dude.y += dude.scale.y * dude.speed;

//画面の一番下に行った時縦の位置をリセット、横の位置をランダムに配置
if (dude.y > HEIGHT) {
dude.y = -10;
dude.x += (Math.random() - 0.5) * 1 * dude.scale.x;
}
}

ティッカーを増やして繰り返します。

tick += 0.1;
});

完成したものがこちらになります( ˘ω˘)☞三☞シュッシュッ卍

See the Pen Pixi.js by Kayoko Hayashi (@Hayachi) on CodePen.


はやちめっちゃ降ってる✌(´ʘ‿ʘ`)✌

まとめ

今回は雪の表現を試してみましたが、もくもくしたものを使用すれば炎的な表現にもなります。パーティクルを一つ覚えることによって、表現の幅は大きく広がるのではないのでしょうか。それではまた( ˇωˇ)☝