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.loopsetIntervalます。一般的な解決策:

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 に答える