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 を紹介します。