我正在尝试使用Phaser引擎制作一个简单的游戏,但我不断收到上述错误。
var mainState = {
...
playerJump: function(){
yVelocity = -jumpPower;
},
spacePressed: function(){
if(started)
{
return;
}
started = true;
this.playerJump();
},
...
updatePlayer: function(){
if(player.body.x < game.world.centerX)
{
player.body.x += xVelocity;
}
player.body.y += yVelocity;
yVelocity += gravity;
if(player.body.y + player.body.height > floor)
{
this.playerJump();
}
},
...}
如您所见,我已经定义了函数playerJump。您在样本中看到的所有变量都已正确定义并正常工作。当我从“updatePlayer”调用函数“playerJump”时,我没有得到任何错误。但是,如果我尝试从“spacePressed”调用它,我会得到“undefined不是函数异常。”
我使用的引擎是Phaser,我的所有代码都在一个文件中,如果这有任何区别的话。按下该键时,将从回调函数调用“spacePressed”函数。从游戏的主Update循环中调用“updatePlayer”。
你有什么想法可能会发生这种情况吗?当我从一个函数调用它而不是从另一个函数调用它时,为什么它可以工作?很高兴在必要时提供更多代码和详细信息。
答案 0 :(得分:1)
当您使用对象方法作为事件处理程序或回调函数时, 此将不再引用该对象。
解决此问题的最简单方法:
var mainState = { ... };
element.addEventListener(type, mainState.spacePressed.bind(mainState), false);
每个浏览器/版本可能都不支持此方法,因此您可以使用此方法:
var mainState = { ... };
element.addEventListener(type, function() {
mainState.spacePressed.call(mainState);
}, false);
答案 1 :(得分:0)
我假设你已经创建了一个输入处理程序来检测是否按下空格。
这是检测鼠标单击按钮的代码(例如)。只需将“this”传递给第二个参数,以便回调将接收mainState上下文,以便稍后可以调用this.playerJump()
。
spaceButton.events.onInputDown.add(this.spacePressed,this)
this.playerJump()
方法中调用spacePressed()
时,将解决您的问题。