0

setIntervalと呼ばれる変数を作成しましたcycle1。これは、 と同じであるsetIntervalというオブジェクトへのプロトタイプ化された関数の内部で作成されます。作成後も起動しますが、残りのスクリプトとコンソールからはアクセスできません。この間隔を別のプロトタイプ関数からクリアしようとしても、何も起こりません。eGi$_

eGi.prototype.startGame = function() {
    //other code...
    if (somethingOrOther) { 
        var somethingElse = confirm("start interval?");
        if (somethingElse) {
            this.cycle1 = setInterval($_.cycle,toMS(INTERVAL_SECONDS));
        }
    } else {
        this.cycle1 = setInterval($_.cycle,toMS(INTERVAL_SECONDS));
    }
};

次に、別の関数でそれを停止しようとすると

eGi.prototype.gameOver = function() {
    clearInterval(this.cycle1);
    //other code...
    if (restart) {
        $_.startGame();
    } else {
        $_.mainMenu();
    }
};

クリアされることはなく、 の呼び出しで再度作成されるようです$_.startGame$_.cycle1またはeGiインスタンス変数を使用してChromeコンソールからアクセスすることさえできませんegi.cycle1. eGi奇妙なことに、これは私のオブジェクトに属する他の変数にアクセスするために機能します:

var eGi = function(console,cDom,ctxt,game,devMode) {
    $_ = this;
    this.game = game;
    this.cDom = cDom; //specifically, these objects control the canvas' DOM
    this.ctxt = ctxt; //and the CanvasRenderingContext2D
}
eGi.prototype.mainMenu = function() {
    this.ctxt.fillText("Hello",250,250); //this works just fine
    //etc
};

なぜクリアされないのでしょうか?

完全なコード/ゲームはこちら.

4

1 に答える 1

1

いいゲームだなぁ…

問題は、cycle1 (未定義) への参照を含まないゲームオーバー内で「this」を参照していることです。

代わりに、他の関数から参照できるオブジェクトの一部として「cycle1」を保存する必要があります (この場合はゲームオーバー)。

変数をグローバルにすることは良いことではありません。代わりに、「cycle1」を eGi またはそのような名前空間またはオブジェクトの一部として保存できます。

ここを参照してください(作業コード):JSFiddle実装

Javascript コード (開始と停止は入力ボタン)

var eGi = {};

$('#start').click(function start() {
var somethingElse = confirm("start interval?");
if (somethingElse) {
    eGi.cycle1 = setInterval(function(){
        console.log('Running...');
    },1000);
}
});

$('#stop').click(function stop(){
      clearInterval(eGi.cycle1);
    });
​
于 2012-09-05T05:35:14.420 に答える