Как вы поворачиваете элемент холста в положение мыши, используя ванильный Javascript?

#javascript #html5-canvas

Вопрос:

Я работаю над проектом мини-холста и пытаюсь понять, как повернуть элемент холста (прямоугольник, круг) в направлении мыши? Я искал его в Интернете, и примеры, которые я вижу, — это люди, использующие библиотеки. Я знаю, что использовать библиотеку было бы намного проще, но для ее изучения потребуется время. Есть ли способ сделать это с помощью чистого родного JavaScript?

пока что у меня есть вот что:

 class Player{
 constructor({x, y, radius, round}){
  this.x = x;
  this.y = y;
  this.radius = radius;
  this.round = round;
  this.draw(x, y, radius, round);
}
draw(x, y, radius, round){
let that = this;
// begining the path for drawing so that the color doesn't over ride.
c.beginPath();
//this must be on top inorder for color to render.
that.color(player.style.color);
//drawing the rectangle
c.arc(x, y, radius, round, Math.PI * 2);
// creating the outline
c.fill();
// out line to the player
c.linewidth = 10;
// c.strokeStyle = "black";
c.stroke();
c.closePath();
}
 color(color){
  c.fillStyle = color;
  c.strokeStyle = "blue";
 }
}
 

все работает совершенно нормально. Я просто заранее думаю о том, как я заставлю игрока поворачиваться к мыши.

вот ссылка на кодовый файл

https://codepen.io/robotosail/pen/abJLQKp

заранее благодарю вас за вашу помощь.

Комментарии:

1. Если вы имеете в виду переместить элемент в положение мыши, вы можете проверить это , я внес некоторые изменения в ваш кодовый код

2. мой вопрос был о том, как повернуть элемент холста к указателю мыши. например, как это делают 2d-шутеры. Но теперь все хорошо. ваш ответ был действительно полезен, потому что я смог перемонтировать его и получить то, что я хочу, вот ссылка на него codepen.io/robotosail/pen/abJLQKp

Ответ №1:

Итак, после попытки объединить ваш код и мой вместе, вот что я придумал.

 let canvas = document.getElementsByTagName("canvas");
canvas[0].setAttribute("id", "canvas");
//initializing the canvas
canvas = document.getElementById("canvas");
const c = canvas.getContext("2d");
//the width and height of the canvas
const width = window.innerWidth;
const height = window.innerHeight;

//setting the canvas width and height to be the windows
canvas.width = width;
canvas.height = height;

//the player information
let arm_color = "#e8d66f";
let player = {
position :{
x: 509,
y: 300
},
style:{
color: "#e8d66f",
radius: 40,
round: 0,
    stroke_color: "black"
},
};

//the arms
let arm1 = {
position :{
x: 47,
y: 1
},
style:{
color: arm_color,
radius: 15,
round: 0,
    stroke_color: "black"
},
};

let arm2 = {
position :{
x: 1,
y: 47
},
style:{
color: arm_color,
radius: 15,
round: 0,
    stroke_color: "black"
},
};


//drawing the player
class Player{
constructor({x, y, radius, round}){
this.x = x;
this.y = y;
this.radius = radius;
this.round = round;
    
    //calling the draw method
this.draw(x, y, radius, round);
}
draw(x, y, radius, round){
let that = this;
// begining the path for drawing so that the color doesn't over ride.
c.beginPath();
//this must be on top inorder for color to render.
that.color(player.style.color, player.style.stroke_color);
//drawing the rectangle
c.arc(x, y, radius, round, Math.PI * 2);
// creating the outline
c.fill();
// out line to the player
c.linewidth = 10;
// c.strokeStyle = "black";
c.stroke();
c.closePath();
}
color(color, stroke){
c.fillStyle = color;
c.strokeStyle = stroke;
}
}

//drawing the players arms
class Arm{
constructor({x, y, radius, round, color, strokeStyle}){
this.x = x;
this.y = y;
this.radius = radius;
this.round = round;
this.color = color;
    this.strokeStyle = strokeStyle;
this.draw(x, y, radius, round, color, strokeStyle);
}
draw(x, y, radius, round, color, strokeStyle){
let self = this;
c.beginPath();
c.fillStyle = color;
c.strokeStyle = strokeStyle;
c.arc(x, y, radius, round, Math.PI * 2);
c.fill();
c.stroke();
c.closePath();
}
}

//combining the player's body and arms and make them rotate
class Rotate{
constructor(options){
    this.cx = options.x;
    this.cy = options.y;
    this.radius = options.radius;
    this.color = options.color;
    this.angle  = 0;
    this.toAngle = this.angle;
    
    this.binding();
}
binding(){
    const self = this;
    window.addEventListener("mousemove", function(e){
        self.update(e.clientX, e.clientY);
    });
}
update(nx, ny){
    this.toAngle = Math.atan2(ny - this.cy, nx - this.cx);
}
render(){
    c.clearRect(0, 0, canvas.width, canvas.height);
    //saving the current status of the mouse
    c.save();
    //translating to the position of the mouse
    c.translate(player.position.x, player.position.y);
    if(this.toAngle !== this.angle){
        c.rotate(this.toAngle - this.angle);
    }
    
    //the players body
let hero = new Player({x: 0, y: 0, radius: player.style.radius, round: 
player.style.round});
    
    //the players first arm
let heroArm1 = new Arm({x: arm1.position.x, y: arm1.position.y, radius: 
arm1.style.radius, round: arm1.style.round, color: arm1.style.color, strokeStyle: 
arm1.style.stroke_color});
    
    //the players second arm
    let heroArm2 = new Arm({x: arm2.position.x, y: arm2.position.y, radius: 
arm2.style.radius, round: arm2.style.round, color: arm2.style.color, strokeStyle: 
arm2.style.stroke_color});
    c.restore();
 }
}

//combining the players arms and body together
let rotatingCircle = new Rotate({x:500, y:300, radius:player.style.radius, color: 
player.style.color});
 

спасибо за вашу помощь.