我正在用画布构建一个新的 Javascript 游戏,我想为每个对象添加一个事件监听器。当从智能手机/平板电脑打开游戏时,我想画一个有用的操纵杆(箭头)。因此,玩家将能够通过单击每个箭头来移动角色。
这就是我所拥有的:
游戏.js:
class Game {
constructor() {
this.touchDevice = false;
this.joystickDown = new Down();
this.joystickLeft = new Left();
this.joystickRight = new Right();
this.joystickUp = new Up();
this.imgDownArrow = new Image();
this.imgLeftArrow = new Image();
this.imgRightArrow = new Image();
this.imgUpArrow = new Image();
this.gameStruct = new Object();
this.gameLoaded = true;
this.gameOver = false;
}
}
initialize(width = 640, height = 480) {
console.log("Game initialized");
this.canvas = document.getElementById("canvas");
this.canvas.width = width;
this.canvas.height= height;
if(this.canvas && this.canvas.getContext) {
this.ctx = this.canvas.getContext("2d");
if(this.ctx) {
this.ctx.strokeStyle="#000";
this.gameStruct.ctx = this.ctx;
this.gameStruct.canvas = this.canvas;
function is_touch_device() {
try {
document.createEvent("TouchEvent");
return true;
} catch (e) {
return false;
}
}
this.touchDevice = is_touch_device();
if(this.touchDevice) {
this.imgDownArrow.src = "img/joystick/arrow_down.png";
this.imgLeftArrow.src = "img/joystick/arrow_left.png";
this.imgRightArrow.src = "img/joystick/arrow_right.png";
this.imgUpArrow.src = "img/joystick/arrow_up.png";
this.gameStruct.imgDownArrow = this.imgDownArrow;
this.gameStruct.imgLeftArrow = this.imgLeftArrow;
this.gameStruct.imgRightArrow = this.imgRightArrow;
this.gameStruct.imgUpArrow = this.imgUpArrow;
this.joystickDown.initialize(this.gameStruct);
this.joystickLeft.initialize(this.gameStruct);
this.joystickRight.initialize(this.gameStruct);
this.joystickUp.initialize(this.gameStruct);
}
} else
alert("error_context");
}
}
animate() {
this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);
if(!this.gameOver) {
this.player.draw();
if(this.touchDevice) {
this.joystickDown.draw();
this.joystickLeft.draw();
this.joystickRight.draw();
this.joystickUp.draw();
}
}
window.requestAnimationFrame(this.animate.bind(this));
}
Down.js:
class Down {
constructor() {
}
initialize(gameStruct) {
this.gameStruct = gameStruct;
this.ctx = gameStruct.ctx;
this.width = gameStruct.canvas.width / 15;
this.height = gameStruct.canvas.width / 15;
this.x = (gameStruct.canvas.width) - (this.width*2);
this.y = gameStruct.canvas.height-this.height;
this.limitTop = 0;
this.limitBottom = gameStruct.canvas.height;
this.limitLeft = 0;
this.limitRight = gameStruct.canvas.width;
this.shiftX = this.width / 8;
this.shiftY = this.height / 8;
console.log("Joystick initialized");
return this;
}
draw() {
this.ctx.drawImage(this.gameStruct.imgDownArrow, this.x, this.y, this.width, this.height);
addEventListener("click", function() {
console.log("clicked");
});
return this.gameStruct;
}
}
(Left、Right 和 Up 类的代码类似。唯一的区别是它们的位置(X 和 Y)以及它们在 drawImage 中的图片)。
正如您在我的代码中看到的那样,我尝试添加 addEventListener("click") 但是当我在网络浏览器中对其进行测试时,当我单击屏幕中的任意位置时它会起作用。但是,我只希望它在单击每个对象(下、左、右和上)时工作。
我也尝试过,this.addEventListener但现在也可以了。
当我单击向下时会发生这种情况:
另外,我不明白为什么它会多次打印“点击”。我只单击了一次向下箭头!像这样的印刷品有600张!它应该只是一个来自Down.js.
任何人都可以帮忙吗?
