Я новичок в JavaScript, и я пытаюсь написать простой игровой цикл. Вот моя цель игры:'this' в методе объекта
var Game = {
timers: [],
start: timestamp(),
stopTimers: function() {
consoleEntry('All timers have been stopped.');
this.timers.length = 0;
},
update: function(elasped) {
for (var i = 0; i < this.timers.length; ++i) {
var timer = elapsed - timers[i].startTime;
console.log('Timer: ' + timer + '. Timer interval: ' + this.timers[i].interval + '.');
if (this.timers[i].interval <= timer) {
this.timers[i].times--;
this.timers[i].report = true;
if (this.timers[i].times != 0) {
this.timers[i].startTime = elapsed;
}
}
}
},
render: function() {
for (var i = 0; i < this.timers.length; ++i) {
if (this.timers[i].report) {
consoleEntry('Timer: ' + this.timers[i].name + ' (' + this.timers[i].times + ' remaining).');
this.timers[i].report = false;
if (this.timers[i].times == 0) this.timers.splice(i, 1);
}
}
},
gameLoop: function() {
var elapsed = timestamp() - this.start;
this.update(elapsed);
this.render();
requestAnimationFrame(this.gameLoop);
},
startGame: function() {
console.log(this);
requestAnimationFrame(this.gameLoop);
}
}
Я называю Game.startGame();
, когда <body>
нагрузки. Вот ошибка, которую я получаю: Uncaught TypeError: undefined is not a function
. Он относится к this.update(elapsed);
внутри функции gameLoop
. По какой-то причине я не понимаю, когда я делаю console.log(this)
внутри startGame
Я получаю объект, к которому он принадлежит (что является удивительным), но когда я делаю то же самое внутри gameLoop
, я получаю объект Window
.
Кто-нибудь знает, почему это происходит?
Спасибо!
Вы называете новую игру, а затем вызываете startGame на новый объект, который вы только что создали? Или вы буквально просто называете Game.startGame()? – Jazzepi
буквально :) Я не должен, а? – user1563544
Вы должны привязать 'this' к функции, которую вы передаете' requestAnimationFrame() '-' requestAnimationFrame (this.gameLoop.bind (this)); ' – Pointy