2015-10-04 2 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 секунд, если я создал это вар OBJ = яблоко (5 , 5)

в начале obj.removeMe должно быть ложным, но через 5 секунд оно должно стать истинным.

+2

'this' является функцией области видимости. Таким образом, он изменяется внутри функции таймаута. Используйте 'var _this = this' в конструкторе и' _this' в тайм-ауте. – Oriol

ответ

2

Это происходит потому, что функция, которую вы передаете как параметр в метод setTimeout, не поддерживает один и тот же контекст из-за Javascript's lexical scoping.

Вы можете переопределить это поведение, используя Function.prototype.bind, например:

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

Большое вам спасибо! – YonatanAr

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 для подобных проблем. –

Смежные вопросы