JavaScript TypeError,无法访问对象的方法

时间:2019-04-06 21:41:26

标签: javascript object typeerror p5.js

我正在使用p5.js,node.js和socket.io在浏览器中制作一个小型多人游戏。称为“玩家”的对象从一个客户端传递到另一个客户端,以同步两个客户端。这对于不依赖方法调用的其他代码也可以正常工作。但是,既然我现在也想访问播放器对象中存储对象的方法,那么它将不再起作用。

这将是存储所有变量的对象以及两个客户端之间具有对象的数组:

var player = {
  structures: []
};

现在,如果我像这样向其添加一个名为campfire的对象:

player.structures.push(new campfire(mouseX,mouseY));

并尝试调用对象篝火的draw()方法,如下所示:

class campfire {
constructor(x,y){
    this.scale = 40;
    this.x = x;
    this.y = y;
    this.maxLevel = 3;
    this.button = new button(this.x, this.y+50, this.x-50, this.y-70, upgrade, upgrade_hover, this);
    this.show_upgrade_button = true;
}

draw(){
    switch(player.campfire.level){
        case 1: image(fire, this.x, this.y, this.scale, this.scale);break;
        case 2: image(campfire_2, this.x, this.y, this.scale, this.scale);break;
        case 3: image(campfire_3, this.x, this.y, this.scale, this.scale);break;
        default: console.log("cant upgrade, this shouldn't happen.");
    }
    if(this.show_upgrade_button){
        this.button.draw();
    }
}

trigger(){      
    if(player.campfire.level + 1 <= this.maxLevel && this.show_upgrade_button == true){
        this.button.trigger();
    }
}}

使用

player.structures[i].draw();

(客户端未将对象“ campfire”推送到数组“结构”的控制台)显示以下错误:

gui.js:38 Uncaught TypeError: player.structures[i].draw is not a function

将篝火对象推送到数组的客户端能够进行draw()调用,并且不会显示错误消息。但是,另一个尚未将对象推送到数组的客户端将无法使用该方法并输出错误,即使它们都共享相同的“玩家”对象。奇怪的是,打印出错误的代码仍然能够访问篝火对象的所有变量,因此它似乎只会影响方法。

我发现的唯一资源是这篇文章https://airbrake.io/blog/javascript-error-handling/x-is-not-a-function-typeerror 我试图将函数重命名为draw = function(){}和campfire.prototype.draw = function(){},但这对我没有任何影响。我认为函数声明不正确吗?这将是我目前唯一可能的解释。

感谢您花时间阅读我的问题!

编辑:这是项目的链接:https://github.com/Mayhoon/Multiplayer-Browsergame

1 个答案:

答案 0 :(得分:1)

我认为您的问题更多是在设计层面上。 Socket.io(或任何其他同步库)并不是真的要来回推送整个代码。在您的情况下,那将是篝火的功能。

我建议仅前后推动state。玩家有锤子吗?玩家有多少生命?玩家有篝火吗?换句话说,只有同步不断变化的数据。

由于篝火的功能(平局功能)对于所有玩家都是相同的,因此无需每隔几秒钟就不断地来回推送该代码!效率很低!

相反,当您的同步对象说播放器有篝火时,您可以在客户端中创建篝火实例。

在看起来像这样的代码中(只是一个主意):

为socket.io同步对象

var player = {
  structures: {campfire:true}
};

客户代码

// create campfire instances, tell the campfire which player it belongs to
if(player.structures.campfire) {
    let cf = new Campfire(player)
    cf.draw()
}

注意:很可能是socket.io剥离了可执行代码