我做了一个简单的问答游戏。这是我在一个对象中的一些相关方法。
但是不起作用。我总是在'rightAnswerGot'功能中出错。控制台掉线 “uncaught typeerror undefined不是对象方法的函数”for 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;
}
}
当用户选择正确的答案时,目的是冻结游戏一秒钟,然后转到下一个问题。任何想法为什么会发生?
由于
答案 0 :(得分: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。
答案 1 :(得分:0)
我想知道发生的事情是它试图调用this.addVariantsHtml
方法,然后调用this.updateCharacter
并获取ID。
所以你可能期望它在运行时,它就像是:
this.addVariantsHtml(1);
但它实际上试图运行
this.addVariantsHtml(this.updateCharacter());
所以就这样做:
var id = this.updateCharacter();
this.addVariantsHtml(id);
或者你需要研究方法链接/管道,这很复杂,不需要用于这种情况,但很有趣:)
答案 2 :(得分: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);
},