0

我做了一个简单的问答游戏。这是我在一个对象中拥有的一些相关方法。

但不起作用。我总是在“rightAnswerGot”函数中遇到错误。控制台为 this.addVariantsHtml(this.updateCharacter()) 删除“未捕获的类型错误未定义不是对象方法的函数”;

BasicGame.Game.prototype = {


    actionOnClick: function (button) {
    var log;
    if(button.value==this.char_bubble.text) {

        setTimeout(this.rightAnswerGot,1000);

    } else {
        // wrong

              swoshsound.play();

    }
    console.log(log);
},

 rightAnswerGot: function (){

        this.addVariantsHtml(this.updateCharacter());


    },

 addVariantsHtml: function(id) {

    this.answer = this.getAnswersVariants(id);

    for (var i = 0; i < 6; i++) {
        this.button[i].value = this.answer[i]['trans'];
        this.button[i].char_id = this.answer[i]['id'];
        this.ans_text[i].setText(this.answer[i]['trans']);

    }
},

updateCharacter: function() {
        var i = this.getRandomCharacter();
        console.log("updateCharacter: "+i + " " +this.chars[i]);

        this.char_bubble.setText(this.chars[i].getPath());
        return i;
    }

}

目的是在用户选择正确答案时冻结游戏一秒钟,然后转到下一个问题。任何想法为什么会发生?

谢谢

4

3 回答 3

2

对我来说,这似乎是一个经典的 JavaScript 范围问题。但是,当您将此问题标记为使用 Phaser 时,我建议您使用 Phaser Timer 事件来避免范围问题。具体来说:

setTimeout(this.rightAnswerGot,1000);

将其替换为:

this.game.time.events.add(Phaser.Timer.SECOND, this.rightAnswerGot, this);

这将创建一个仅触发一次的 1 秒计时器,并在结束时调用您的函数。当然,您可以使用 1000 代替 Phaser.Timer.SECOND。

于 2014-06-02T14:22:52.357 回答
0

我会想象发生的事情是它在调用并获取 IDthis.addVariantsHtml之前尝试调用该方法。this.updateCharacter

因此,您可能期望它在运行时类似于:

this.addVariantsHtml(1);

但它实际上试图运行

this.addVariantsHtml(this.updateCharacter());

所以只需这样做:

var id = this.updateCharacter();
this.addVariantsHtml(id);

要么,要么您需要研究方法链接/管道,这很复杂,不需要用于这种情况,但很有趣:)

于 2014-06-02T09:45:16.413 回答
0

好的,我找到了使它起作用的东西!

这是一个解决方案:

 actionOnClick: function (button) {
    var log;
    if(button.value==this.char_bubble.text) {
var context=this;
        setTimeout(function() {


  context.addVariantsHtml(context.updateCharacter());


},1000);

    } else {
        // wrong

              swoshsound.play();

    }
    console.log(log);
},
于 2014-06-02T10:06:37.577 回答