Canvasアニメーションの基礎については下記を参考にしてください。
この記事は下記をベースとして進めます。
HTML5で作るCanvasアニメーションの基礎
HTML5+Canvasでパーティクルっぽいのを作ってみる
HTML5+Canvasで学ぶ物理アニメーションの基礎
マウスのイベントの取得方法
JavaScriptでクリックイベントを取得するには「addEventListener」を使用します。
例えばcanvas内でクリックした情報を取得したい場合は下記のようにします。
canvas.addEventListener('click', function(e) {
console.log('click');
}, false);
「click」を「mousemove」とすればマウス移動時にイベントが実行されます。
canvas.addEventListener('mousemove', function(e) {
マウスの位置を取得する
「e.clientX」「e.clientY」でマウスのX,Y座標を取得できますがそのままだと画面全体の座標になります。
canvas内の座標を取得する場合は「getBoundingClientRect」でcanvasの座標値を引きます。
var rect = canvas.getBoundingClientRect();
canvas.addEventListener('click', function(e) {
var mouseX = e.clientX - rect.left;
var mouseY = e.clientY - rect.top;
}, false);
マウスに追従して移動する
イベントの取得方法がわかったところで、適当なオブジェクトをマウスカーソルに追従させてみましょう。以前の記事と組み合わせるとわりと簡単にできます。
See the Pen JYPPje by webopixel (@webopixel) on CodePen.
window.requestAnimFrame = (function(){
return window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.oRequestAnimationFrame ||
window.msRequestAnimationFrame ||
function(callback){
window.setTimeout(callback, 1000 / 60);
};
})();
window.onload = function() {
// Canvas未サポートは実行しない
if (!window.HTMLCanvasElement) return;
var canvas = document.querySelector('#canvas-container');
var ctx = canvas.getContext('2d');
//マウスをクリックした座標
var clickPoint = {
x: 0,
y: 0
};
var Particle = function(scale, color, speed) {
this.scale = scale; //大きさ
this.color = color; //色
this.speed = speed; //速度
this.position = { // 位置
x: 0,
y: 0
};
};
Particle.prototype.draw = function() {
ctx.beginPath();
ctx.arc(this.position.x, this.position.y, this.scale, 0, 2*Math.PI, false);
ctx.fillStyle = this.color;
ctx.fill();
};
Particle.prototype.update = function() {
this.position.x += (clickPoint.x - this.position.x) / this.speed;
this.position.y += (clickPoint.y - this.position.y) / this.speed;
this.draw();
};
var particle = new Particle(7, '#D0A000', 20);
var loop = function() {
requestAnimFrame(loop);
// 描画をクリアー
ctx.clearRect(0,0, ctx.canvas.width, ctx.canvas.height);
particle.update();
};
loop();
var rect = canvas.getBoundingClientRect();
// マウスカーソルを動かしたら実行する
canvas.addEventListener('mousemove', function(e) {
var mouseX = e.clientX - rect.left;
var mouseY = e.clientY - rect.top;
clickPoint.x = mouseX;
clickPoint.y = mouseY;
}, false);
};

