假设我的基类如下:
function Tile(obj) {
//defaults (alot of variables here like colors and opacity)
}
Tile.prototype.Draw = function () {
ctx.fillStyle = "rgba(" + this.Red + "," + this.Green + "," + this.Blue + "," + this.Opacity + ")";
ctx.fillRect(this.X, this.Y, this.Width, this.Height);
};
我的类继承自Tile类
Apple.prototype = new Tile();
Apple.prototype.constructor = Apple;
function Apple(obj) {
Tile.apply(this, arguments);
}
所以我想对我的苹果对象做的是它的不透明度在0和1之间波动,以便它不断淡入淡出但是我希望这可以独立于'游戏循环'而发生。 (无论游戏速度如何,褪色动画都是流畅的)
function StartGameLoop() {
console.log("*** Starting Game ***");
gameLoop = setInterval(Game, gameSpeed);
}
function Game() {
if (!IS_GAME_ON) { // Did the game end?
EndGame();
} else if (!PAUSE) { // Is the game not paused?
console.log("Tick");
Logic(); // do any math
}
}
我无法理解如何做到这一点,但我有一个想法,在Apple构造函数中放置一个setInterval,一遍又一遍地调用draw函数,但我无法让它工作。像这样:
Apple.prototype = new Tile();
Apple.prototype.constructor = Apple;
function Apple(obj) {
var AnimationDirection;
var animate = setInterval(this.Draw, 50);
Tile.apply(this, arguments);
}
Apple.prototype.Draw = function () {
ctx.fillStyle = "rgba(" + this.Red + "," + this.Green + "," + this.Blue + "," + this.Opacity + ")";
ctx.fillRect(this.X, this.Y, this.Width, this.Height);
if (this.Opacity <= 0) {
this.AnimationDirection = 0.1;
}
else if (this.Opacity >= 1) {
this.AnimationDirection = -0.1;
}
this.Opacity += this.AnimationDirection;
};
当调用第一个Apple.Draw()但是来自setInterval的调用无法正常工作时,它会按预期工作。有任何想法吗?
(PS:Draw函数中的两个ctx行也在Tile和Apple类中重复,有没有什么方法可以把它踢到Tile父级来填充而不是代码重复?)< / p>
答案 0 :(得分:1)
我认为原因是当Draw()
函数作为setInterval
调用的一部分触发时,this
并不是您认为的。
相反,在构造函数内部使用变量来存储this
的值,当它引用所创建的Apple对象时,使用setInterval()
的匿名函数来引用该新变量并在其上正确调用Draw()
函数,例如类似的东西:
function Apple(obj) {
var AnimationDirection, me = this;
var animate = setInterval(function() {
me.Draw();
}, 50);
Tile.apply(this, arguments);
}
由于您现在在Draw()
对象(而不是全局窗口)上调用Apple
方法,this
将正确引用该对象。