Я пытаюсь написать простую игру с использованием веб-компонентов в Vanilla JS. Тем не менее, у меня возникают некоторые проблемы, когда речь идет о перерисовке элемента canvas. Первый вызов всегда в порядке, и он требует aws круга, как я хочу, но когда вызывается requestAnimationFrame (draw), все атрибуты становятся неопределенными. Почему это происходит и как мне обойти это? вот мой код
class GamePanel extends HTMLElement{
constructor() {
super();
this.shadow = this.attachShadow({ mode: "open" });
this.rightPressed = false;
this.leftPressed = false;
this.upPressed = false;
this.downPressed = false;
this.canvas = document.createElement("canvas");
this.canvas.width = 1000;
this.canvas.height = 500;
this.canvas.style.backgroundColor = "black";
this.shadow.appendChild(this.canvas);
this.ctx = this.canvas.getContext("2d");
this.x = this.canvas.width/2;
this.y = this.canvas.height-30;
this.dx = 2;
this.dy = 2;
this.ballRadius = 10;
this.addEventListener("keydown", this.keyDownHandler, false);
}
draw(){
console.log(this.ctx);
console.log(this.x);
console.log(this.y);
this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);
this.drawBall();
if(this.rightPressed){
this.x += this.dx;
}
else if(this.leftPressed){
this.x -=this.dx;
}
if(this.downPressed){
this.y+= this.dy;
}
else if(this.upPressed){
this.y-=this.dy
}
if(this.x+this.dx > this.canvas.width + this.ballRadius) this.x = 0;
else if(this.x - this.dx < 0 - this.ballRadius) this.x = this.canvas.width
if(this.y+this.dy > this.canvas.height + this.ballRadius) this.y = 0;
else if(this.y - this.dy < 0 - this.ballRadius) this.y = this.canvas.height;
requestAnimationFrame(this.draw);
}
drawBall(){
this.ctx.beginPath();
this.ctx.arc(this.x, this.y, this.ballRadius, 0, Math.PI*2);
this.ctx.fillStyle = "#0095DD";
this.ctx.fill();
this.ctx.closePath();
}
keyDownHandler(e){
if(e.key == "Right" || e.key == "ArrowRight") {
this.rightPressed = true;
this.leftPressed = false;
}
else if(e.key == "Left" || e.key == "ArrowLeft") {
this.leftPressed = true;
this.rightPressed = false;
}
if(e.key == "Up" || e.key == "ArrowUp"){
this.upPressed = true;
this.downPressed = false;
}
else if(e.key =="Down" || e.key == "ArrowDown"){
this.downPressed = true;
this.upPressed = false;
}
}
}
customElements.define("game-panel", GamePanel);
document.getElementsByTagName("game-panel")[0].draw();
ошибка, которую я получаю: Uncaught TypeError: Cannot read property 'ctx' of undefined at draw (script.js:24)