ブラウザ上で動作する、WebGLの知識が無くてもリッチでインタラクティブな2Dグラフィックスを描画することができるライブラリ「PixiJS v5」を試してみました。 PixiJS
PixiJSって?
PixiJSは、WebGL APIに飛び込んだり、ブラウザーとデバイスの互換性を処理したりすることなく、リッチでインタラクティブなグラフィックス、クロスプラットフォームアプリケーション、およびゲームを作成できるようにするレンダリングライブラリです。
WebGLって?
WebGL (Web Graphics Library) は、互換性があるウェブブラウザーでプラグインを使用せずにインタラクティブな 3D グラフィックスや 2D グラフィックスをレンダリングするための JavaScript API です。HTML5
<canvas>
要素へ OpenGL ES 2.0 に密接に従った API を導入することにより、WebGL を実現します。これにより、ユーザーの端末が提供するハードウェアのグラフィックアクセラレーションを API で利用することが可能になります。
WebGL: ウェブの 2D および 3D グラフィック - Web API | MDN
動作サンプル
動作サンプル codepen
環境構築
PixiJSはCDNを使用するので、ファイルはHTMLを一つのみ用意します。
$ touch index.html
サーバーを立てる
http-serverを使用します。 http-server - npm
インストール
$ npm install -g http-server
サーバーの起動
$ http-server
デフォルトでは8080番のポートが使用されます。 http://127.0.0.1:8080
キャンバスを表示する
PIXI.Renderer
を生成し、canvas要素をviewに割り当てます。
<!doctype html> <html> <head> <meta charset="utf-8"> <title>Hello World</title> <script src="https://cdnjs.cloudflare.com/ajax/libs/pixi.js/5.1.3/pixi.min.js"></script> </head> <body> <canvas id="mycanvas"></canvas> <script> const canvas = document.getElementById('mycanvas') const renderer = new PIXI.Renderer({ view: canvas, }) </script> </body> </html>
キャンバスが表示されました。(黒い部分がキャンバスです)
キャンバスのサイズを画面幅に合わせておきます。
... const renderer = new PIXI.Renderer({ view: canvas, width: window.innerWidth, // 追加 height: window.innerHeight, // 追加 }) ...
ステージとスプライトを表示する
画像からスプライトを作成し、ステージに追加します。ステージは画像等の表示物をまとめるコンテナの役割を果たします。
... const stage = new PIXI.Container() const mediumFattyTunaTexture = PIXI.Texture.from('medium_fatty_tuna.png') const sushi = new PIXI.Sprite(mediumFattyTunaTexture) sushi.width = 200 sushi.height = 200 // 配置や回転に使用する原点を設定する sushi.anchor.set(0.5) // 配置座標を指定 sushi.x = renderer.width * 0.5 sushi.y = renderer.height * 0.5 // ステージに配置 stage.addChild(sushi) // ステージをレンダリング renderer.render(stage)
sushiが描画されました。
アニメーションを作る
PIXI.Ticker
を用いてフレーム毎のループ処理を記述し、アニメーションを作ってみます。
... const animate = () => { sushi.rotation += 0.05 renderer.render(stage) } const ticker = new PIXI.Ticker() ticker.add(animate) ticker.start()
寿司が回り始めました。
インタラクションを使用する
interactive
プロパティを用いることでインタラクションを有効化できます。
有効化後、イベントリスナーを追加しアニメーションスタート処理を記述します。
... // ticker.add(animate) // コメントアウト // ticker.start() // コメントアウト sushi.interactive = true sushi.on('pointertap', () => { ticker.add(animate) ticker.start() })
クリック or タップに反応して回転を始めるようになりました。
最終的なコード内容はこのようになります。
<!doctype html> <html> <head> <meta charset="utf-8"> <title>Hello World</title> <script src="https://cdnjs.cloudflare.com/ajax/libs/pixi.js/5.1.3/pixi.min.js"></script> </head> <body> <canvas id="mycanvas"></canvas> <script> const canvas = document.getElementById('mycanvas') const renderer = new PIXI.Renderer({ view: canvas, width: window.innerWidth, // 追加 height: window.innerHeight, // 追加 }) const stage = new PIXI.Container() const mediumFattyTunaTexture = PIXI.Texture.from('medium_fatty_tuna.png') const sushi = new PIXI.Sprite(mediumFattyTunaTexture) sushi.width = 200 sushi.height = 200 // 配置や回転に使用する原点を設定する sushi.anchor.set(0.5) // 配置座標を指定 sushi.x = renderer.width * 0.5 sushi.y = renderer.height * 0.5 // ステージに配置 stage.addChild(sushi) // ステージをレンダリング renderer.render(stage) const animate = () => { sushi.rotation += 0.05 renderer.render(stage) } const ticker = new PIXI.Ticker() // ticker.add(animate) // ticker.start() sushi.interactive = true sushi.on('pointertap', () => { ticker.add(animate) ticker.start() }) </script> </body> </html>
おわり
以上、PixiJSを試してみた内容でした。 簡単な記述でWebアニメーションを作成できるので、ちょっと頑張ればゲームなんかも作成できそうです。 PixiJS Examples PixiJS API Documentation