Phaser事件问题。为什么我的更改会解决它?

时间:2015-07-16 16:38:37

标签: phaser-framework

为标题道歉,但我希望有人可以解释为什么我会收到以下错误,为什么我改变了修复它。

概述:

我正在创造一个游戏,你必须射击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');切换状态?

当这种情况发生并且赔率调整后,发生这种情况的可能性会非常小,但在发展的那一刻,每个人都是胜利者。

非常感谢任何建议。

1 个答案:

答案 0 :(得分:0)

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

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