1

我正在尝试使用 Jvascript 制作游戏引擎。到目前为止,我有:

function gameEngine() {

    this.canvas = $('canvas')[0];
    this.ctx = this.canvas.getContext('2d');
    this.framerate = 20;

    this.resetCanvas = function() {
        this.ctx.fillStyle = 'red';
        this.ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);
    };

    this.loop = function() {
        this.resetCanvas();
    };

    this.run = function() {
        setInterval(this.loop, this.framerate);
    };
}

new gameEngine();

但是画布没有出现;为什么?

4

3 回答 3

5

this传递this.loop到时变得分离setInterval常见解决方案:

Function.bind

this.run = function() {
    setInterval(this.loop.bind(this), this.framerate);
};

或者使用闭包:

var self = this;
this.run = function() {
    setInterval(function () {
        self.loop();
    }, this.framerate);
};

然后你需要实际调用run方法:

new gameEngine().run();

// or 

function gameEngine() {

    // snip...

    this.run();
}
于 2013-02-25T04:11:16.953 回答
1

你从不打电话setInterval

var ngin = new gameEngine();
ngin.run();
于 2013-02-25T04:11:11.487 回答
1

您需要在初始化后调用您的run()函数。gameEngine您可能还想将您的存储gameEngine在一个变量中。

例子:

var myGameEngine = new gameEngine();
myGameEngine.run();

或者,如果您不想调用 run,请坚持this.run()在对象定义的末尾。这消除了存储对您的gameEngine对象的引用的需要,尽管您可能仍然应该供以后参考。

于 2013-02-25T04:11:18.187 回答