Canvas: Obracanie obiektu za pomocą myszki

Opublikowano: 08.06.2023 - tagi: Canvas JavaScript Ruch Obrót Myszka

Myszka i obrót

Żeby obrócić obiekt w kierunku, w którym znajduje się kursor myszy, należy obliczyć kąt. Kąt, który znajduje się pomiędzy: dodatnią osią X i linią prostą, którą tworzą dwa punkty: pierwszy punkt to (0, 0), a drugi to: podany (x, y).

W poniższym przykładzie drugi punkt jest obliczany, w następujący sposób:

const y = rect.y - mouse.y + canvasRect.top;
const x = rect.x - mouse.x + canvasRect.left;

gdzie:

rect - To pozycja obracanego obiektu mouse - To pozycja kursora myszy canvasRect - To pozycja płótna

Mając już obliczony punkt, można pobrać informacje o kącie, o jaki powinien zostać obrócony obiekt:

angle = Math.atan2(y, x);

Kąt zwracany jest w radianach.

Przykład

Demo znajdziesz tutaj

HTML:

<canvas id="canvas" width="800" height="600"></canvas>

JavaScript

let angle = 0;
const step = 15;
const mouse = { x: 0, y: 0 };

const canvas = document.getElementById('canvas');
const context = canvas.getContext("2d");
const canvasRect = canvas.getBoundingClientRect();
const rect = {
    width: 50,
    height: 50,
    x: context.canvas.width / 2,
    y: context.canvas.height / 2
}

document.addEventListener('mousemove', (e) => {
    mouse.x = e.clientX;
    mouse.y = e.clientY;
    const y = rect.y - mouse.y + canvasRect.top;
    const x = rect.x - mouse.x + canvasRect.left;
    angle = Math.atan2(y, x);
});

document.addEventListener('keydown', (e) => {
    rect.x += -step * Math.cos(angle);
    rect.y += -step * Math.sin(angle);
});

const render = () => {
    context.fillStyle = '#000';

    context.fillRect(0, 0, context.canvas.width, context.canvas.height);
    context.fillStyle = '#ff0000';
    context.save();
    context.translate(rect.x, rect.y)
    context.rotate(angle);
    context.fillRect(-rect.width / 2, -rect.height / 2, rect.width, rect.height);
    context.restore();
    requestAnimationFrame(render);
}
render();