移相器事件问题。为什么我的更改解决了它?

Phaser event issue. Why did my change resolve it?

对标题表示歉意,但我希望有人能解释为什么我会收到以下错误以及我如何更改修复它。

概览:

我正在制作一款游戏,您必须射击 3 个目标才能获胜。如果您全部命中 3 个,则会加载 HIT 状态(因此,如果您没有命中所有 3 个,则会加载 MISS 状态)。一旦进入 HIT 状态,您单击屏幕,然后触发一些游戏逻辑来确定您是否赢得了奖品。游戏逻辑是一个运行的 php 脚本和 returns 通过 ajax 输赢的变量。返回后,将触发状态更改,根据结果将您定向到 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.

然后它指出 this.playAgain 在我的 WON 状态。

我想知道为什么将其更改为 this.playAgainBtn 可以消除错误。我应该摧毁 events/signals 吗?我应该以不同的方式命名我的函数,即使它们在不同的 states/objects 中吗? 还有为什么我需要打电话给 MyGame.game.state.start('Won');在 ajax 请求中而不是 this.state.start('Won');切换状态?

当它上线并调整赔率时,发生这种情况的可能性将非常渺茫,但目前对于开发而言,每个人都是赢家。

非常感谢任何建议。

您添加了一个名为 playAgain 的按钮,但回调方法也称为 playAgain,它们具有相同的名称,这就是导致错误的原因。

当第一次调用 MyGame.Won.create() 并添加 MyGame.Won.playAgain 按钮时,该按钮会保留对原始回调函数 MyGame.Won.playAgain() 的引用。但是第二次启动Won-state MyGame.Won.create()也被调用了,然后你原来的回调函数的引用就丢失了,因为它被按钮有效覆盖了。