设置控件不适用于一个对象实例但适用于其他对象实例
Set Controls not working for one object instance but works for other
我正在尝试使用 JS 创建多人游戏。
function EvilBall(player,color)
{
EvilCircle.call(this,this.size,this.velY,this.velX);
this.color=color;
this.score =0;
this.player=player;
}
EvilBall.prototype=Object.create(EvilCircle.prototype);
EvilBall.prototype.constructor =EvilBall;
EvilBall.prototype.setControls=function(left,right,down,up){
var _this = this;
window.onkeydown = function(e) {
console.log(e.keyCode);
if (e.keyCode === left) {
_this.x -= _this.velX;
} else if (e.keyCode === right) {
_this.x += _this.velX;
} else if (e.keyCode === down) {
_this.y -= _this.velY;
} else if (e.keyCode === up) {
_this.y += _this.velY;
}
}
}
在此之后,我创建了两个 EvilBall 实例,并使用内部具有事件处理函数的 setControls 函数设置控件。
var evilBall = new EvilBall('p1','white');
var evilBall2 = new EvilBall('p2','yellow');
evilBall2.setControls(65,68,87,83);
evilBall.setControls(37,39,38,40);
只有键为 37、39、38 和 40 的 evilBall 实例在按下键时有效。我认为由于 evilBall2 下面提到了 evilBall,所以它工作正常。如果事件处理程序在一个实例上工作正常,为什么在另一个实例上不起作用?
当事件处理程序仅在一个实例上工作时,我们如何在 JS 中开发多人游戏?
谁能给我解释一下。我在这里遗漏了什么吗?
Window onkeydown 是一个 属性:
window.onkeydown = ()=>alert("one");
window.onkeydown = ()=>alert("two");//will override the first
window.onkeydown();
所以使用 window.addEventListner 代替:
window.addEventListener("keydown",function(event){
...
});
总的来说,只有一个事件侦听器可能会更好:
var keylisteners=[];
window.onkeydown=function(e){
(keylisteners.find(el=>el.key==e.keyCode)||{callback:function(){}}).callback();
};
这样使用:
keylisteners.push({
key:42,
callback:function(){}
});
顺便说一下,你的形状函数不带参数:
Shape.call(this); //will do the job too
我正在尝试使用 JS 创建多人游戏。
function EvilBall(player,color)
{
EvilCircle.call(this,this.size,this.velY,this.velX);
this.color=color;
this.score =0;
this.player=player;
}
EvilBall.prototype=Object.create(EvilCircle.prototype);
EvilBall.prototype.constructor =EvilBall;
EvilBall.prototype.setControls=function(left,right,down,up){
var _this = this;
window.onkeydown = function(e) {
console.log(e.keyCode);
if (e.keyCode === left) {
_this.x -= _this.velX;
} else if (e.keyCode === right) {
_this.x += _this.velX;
} else if (e.keyCode === down) {
_this.y -= _this.velY;
} else if (e.keyCode === up) {
_this.y += _this.velY;
}
}
}
在此之后,我创建了两个 EvilBall 实例,并使用内部具有事件处理函数的 setControls 函数设置控件。
var evilBall = new EvilBall('p1','white');
var evilBall2 = new EvilBall('p2','yellow');
evilBall2.setControls(65,68,87,83);
evilBall.setControls(37,39,38,40);
只有键为 37、39、38 和 40 的 evilBall 实例在按下键时有效。我认为由于 evilBall2 下面提到了 evilBall,所以它工作正常。如果事件处理程序在一个实例上工作正常,为什么在另一个实例上不起作用? 当事件处理程序仅在一个实例上工作时,我们如何在 JS 中开发多人游戏? 谁能给我解释一下。我在这里遗漏了什么吗?
Window onkeydown 是一个 属性:
window.onkeydown = ()=>alert("one");
window.onkeydown = ()=>alert("two");//will override the first
window.onkeydown();
所以使用 window.addEventListner 代替:
window.addEventListener("keydown",function(event){
...
});
总的来说,只有一个事件侦听器可能会更好:
var keylisteners=[];
window.onkeydown=function(e){
(keylisteners.find(el=>el.key==e.keyCode)||{callback:function(){}}).callback();
};
这样使用:
keylisteners.push({
key:42,
callback:function(){}
});
顺便说一下,你的形状函数不带参数:
Shape.call(this); //will do the job too