Tween.jsでアニメーションしてみる
こんにちは。受託開発担当のMasaです。
3年ぶりの登場です。久しぶりなのでユルいネタでリハビリします。
今日はJavaScript製のアニメーションライブラリである、Tween.jsを使ってアニメーションを表現します。
まずはアニメーションなしでサンプルを作成します。
Web 上でのサンプルはhtml要素をアニメーションさせてる例が多いので、あえて自分で描画することにします。
<!DOCTYPE html> <head> <style> body { margin: 0px; padding: 0px; } #c { background-color: black; } </style> <script> window.onload = function() { var canvas = document.getElementById('c'); var context = canvas.getContext('2d'); var position = {x: 65, y: 45}; // 円を描画する var draw = function() { context.beginPath(); context.clearRect(0, 0, canvas.width, canvas.height); context.fillStyle = 'rgb(155, 187, 89)'; context.arc(position.x, position.y, 35, 0, Math.PI*2, false); context.fill(); }; canvas.onmousedown = function(e) { var rect = e.target.getBoundingClientRect(); // 円の中心点をマウス位置に更新 position['x'] = e.clientX - rect.left; position['y'] = e.clientY - rect.top; draw(); }; // 初期位置に円を描画 draw(); }; </script> </head> <body> <canvas id="c" width="640" height="480"> 未対応 </canvas> </body> </html>
黒い背景部分をクリックすると、円が移動するだけの簡単なサンプルです。
これじゃつまらないので、Tween.jsで移動前と移動後の座標を補間して滑らかなモーションを実現します。
tween.min.js を使うのでインクルードします。
<script src='tween.min.js'></script>
座標を更新する関数を追加して、
var animate = function() { requestAnimationFrame( animate ); TWEEN.update(); };
マウスダウンでアニメーションを開始します。
canvas.onmousedown = function(e) { var rect = e.target.getBoundingClientRect(); var mouseX = e.clientX - rect.left; var mouseY = e.clientY - rect.top; var target = { x: mouseX, y: mouseY }; // コンストラクタ引数の position がトゥィーン対象 var tween = new TWEEN.Tween(position) // 1000 ミリ秒かけて position を target にする .to(target, 1000) // イージング関数の指定 .easing(TWEEN.Easing.Exponential.In) // 更新毎に draw を呼び出す .onUpdate(draw) // アニメーションの開始 .start(); animate(); };
完成です。
他にもアニメーションを開始してから実際に実行されるまでの時間を指定する delay や、アニメーションのリピート回数を指定する repeat 等もあります。
// コンストラクタ引数の position がトゥィーン対象 var tween = new TWEEN.Tween(position) // 1000 ミリ秒かけて position を target にする .to(target, 1000) // 500 ミリ秒後に実行 .delay(500) // 同じ動作を 5 回繰り返す .repeat(5) // イージング関数の指定 .easing(TWEEN.Easing.Exponential.In) // 更新毎に draw を呼び出す .onUpdate(draw) // アニメーションの開始 .start();
以上で終わりです。
もし次回があるのならば、ColorTween や TextTween を紹介します。