2015-10-04 37 views
2

我正在用一个英雄人物创造一个游戏,他的任务是收集水果遍布画布。对象内设置超时功能

事情是,每个水果在画布上都有自己的到期时间。 例如,香蕉会出现5秒,橙色会出现10秒等等。

我试图做的事情是创建一个对象,该对象的每个实例都有一个定时器,它在选定后改变布尔值时间

我的代码看起来是这样的:

function apple(timeToStay,score){ 
this.kind = "apple"; 
this.timeTostay = timeToStay; 
this.score=score; 
this.imgsrc = "images/apple.png"; 
this.x = 32 + (Math.random() * (canvas.width - 64)); 
this.y = 32 + (Math.random() * (canvas.height - 64)); 
this.removeMe = false; 

setTimeout(function() { this.removeMe=true; }, timeToStay*1000); 

return this; 

}

,你可以看到我以为设置超时与实例将例如5秒后火,如果我创造了它的VAR OBJ =苹果(5 ,5)

在开始obj.removeMe应该是假的,但5秒后应该变成真。

+2

'this'是功能范围的。所以它在超时功能内部发生了变化。在构造函数中使用'var _this = this',在超时时使用'_this'。 – Oriol

回答

0

这应该工作:

function apple(timeToStay,score){ 
    this.kind = "apple"; 
    this.timeTostay = timeToStay; 
    this.score=score; 
    this.imgsrc = "images/apple.png"; 
    this.x = 32 + (Math.random() * (canvas.width - 64)); 
    this.y = 32 + (Math.random() * (canvas.height - 64)); 
    this.removeMe = false; 

    var base = this; 

    setTimeout(function() { base.removeMe=true; }, timeToStay*1000); 

    return this; 
} 
+0

这很糟糕,你应该总是使用bind/call/apply来解决这类问题。 –