为标题道歉,但我希望有人可以解释为什么我会收到以下错误,为什么我改变了修复它。
概述:
我正在创造一个游戏,你必须射击3个目标才能获胜。如果你点击全部3,则加载一个HIT状态(因此,如果你没有点击全部3,则加载一个MISS状态)。一旦进入HIT状态,您单击屏幕,然后触发一些确定您是否赢得奖品的游戏逻辑。游戏逻辑是一个php脚本,它运行并通过ajax返回一个win或win变量。返回后,将触发状态更改,以根据结果将您引导至WIN状态或LOSE状态。
所有4个州代码:
命中状态
MyGame.Hit = function () {};
MyGame.Hit.prototype = {
create: function () {
this.bgd = this.add.image( 0, 0, 'hitBgd');
this.bgd.inputEnabled = true;
this.bgd.events.onInputDown.add( this.gameLogic, this);
},
gameLogic: function () {
var username = 'user';
if (typeof username !== 'undefined') {
var request = new XMLHttpRequest();
request.open('GET', '_/api/logic.php?user=' + username, true);
request.onreadystatechange = function () {
if ((request.readyState === 4) && (request.status === 200)) {
var returnedData = JSON.parse(request.responseText);
if (returnedData.outcome === true) { // Winner
MyGame.game.state.start('Won');
} else { // Loser
MyGame.game.state.start('Lose');
}
}
}
request.send();
} else {
MyGame.game.state.start('Lose');
}
}
};
小姐:
MyGame.Miss = function () {};
MyGame.Miss.prototype = {
create: function (){
this.bgd = this.add.image( 0, 0, 'missBgd');
this.playAgainBtn = this.add.button((this.game.width / 2) - 145, 235, 'playAgainBtn', this.playAgain, this);
this.exitBtn = this.add.button((this.game.width / 2) + 145, 235, 'exitGameBtn', this.exitGame, this);
},
playAgain: function () {
this.state.start('MainMenu');
},
exitGame: function () {
alert('AWAITING LINK FROM CLIENT');
},
};
获胜州
MyGame.Won = function () {};
MyGame.Won.prototype = {
create: function () {
this.bgd = this.add.image( 0, 0, 'wonBgd');
this.playAgain = this.add.button(130, 510, 'wonPlayAgainBtn', this.playAgain, this);
this.exitBtn = this.add.button(395, 510, 'wonExitGameBtn', this.exitGame, this);
},
playAgain: function () {
this.state.start('MainMenu');
},
exitGame: function () {
alert('AWAITING LINK FROM CLIENT');
}
};
失去状态
MyGame.Lose = function () {};
MyGame.Lose.prototype = {
create: function (){
this.bgd = this.add.image( 0, 0, 'loseBgd');
this.playAgainBtn = this.add.button((this.game.width / 2) - 145, 235, 'playAgainBtn', this.playAgain, this);
this.exitBtn = this.add.button((this.game.width / 2) + 145, 235, 'exitGameBtn', this.exitGame, this);
},
playAgain: function () {
this.state.start('MainMenu');
},
exitGame: function () {
alert('AWAITING LINK FROM CLIENT');
}
};
你可以看到MISS,WON和LOSE状态除了在WON状态之外都是一样的,我的按钮被称为 this.playAgain 而不是 this.playAgainBtn 。 你第一次获胜是好的但是如果你再次玩而不刷新页面并进入HIT状态,触发游戏逻辑并获胜,你会得到以下错误
Uncaught Error: Phaser.Signal: listener is a required param of add() and should be a Function.
然后在我的WON状态中指出this.playAgain。
我想知道为什么将此更改为this.playAgainBtn会删除错误。我应该破坏事件/信号吗?我应该以不同的方式命名我的函数,即使它们处于不同的状态/对象中吗? 为什么我需要打电话给MyGame.game.state.start('Won');在ajax请求而不是this.state.start('Won');切换状态?
当这种情况发生并且赔率调整后,发生这种情况的可能性会非常小,但在发展的那一刻,每个人都是胜利者。
非常感谢任何建议。
答案 0 :(得分:0)
您添加一个名为true
的按钮,但回调方法也称为playAgain
,它们具有相同的名称,这就是导致错误的原因。
首次调用playAgain
并添加MyGame.Won.create()
按钮时,该按钮会保留对原始回调函数MyGame.Won.playAgain
的引用。但是第二次启动Won-state MyGame.Won.playAgain()
也被调用,然后对原始回调函数的引用丢失了,因为它被按钮有效地覆盖了。