0

私は自分自身をjavascript/jQueryに取り込んでいるため、Plant vs Zombiesを構築しています。敵のオブジェクトを作成し、そのコードで表示される各敵の参照を作成します。これがオブジェクトです。

var Enemy = function(row, num) {
    'use strict';
    this.row = row;
    this.number = num; 
    this.move_interval;
    this.html_element;
};
Enemy.prototype.create = function() {
    this.html_element = $('<div class="enemy '+this.row+' full" style="left:1140px;top: '+$('tr.row_'+this.row).position().top+'px"></div>').prependTo('.container');

    return this;
};
Enemy.prototype.die = function() {
    clearInterval(this.move_interval);
    this.html_element.remove();
    return this;
};
Enemy.prototype.move = function() {
    this.move_interval = setInterval(function() {moveEnemy(this.number)}, 2000);
    return this;
};

これは敵を作成するための間隔です (i はグローバル変数 "var i = 0;" として定義されます):

enemy_interval = setInterval("addEnemy(i++)", 9000)}

これは敵を作成する関数です (ランダムなものは、敵がスポーンできる行が 4 つあるためです。これは、オブジェクトのプロパティ行の目的でもあります):

function addEnemy(num) {
    if (num < 5) {
        switch (getRandom(1,4)) {
            case 1:
                enemies[num] = new Enemy("one", num);
                enemies[num].create().move();
                break;
            case 2:
                enemies[num] = new Enemy("two", num)
                enemies[num].create().move();
                break;
            case 3:
                enemies[num] = new Enemy("three", num)
                enemies[num].create().move();
                break;
            case 4:
                enemies[num] = new Enemy("four", num)
                enemies[num].create().move();
                break;
            default:
                break;
        }
    }
}

そして、エラーが表示されている場所は次のとおりです。

function moveEnemy(number) {
    enemies[number].html_element.animate({left: "-=150"}, 2000, "linear");
}

moveEnemy 関数を編集してプロパティ「html_element」をパラメーターとして取得し、そのようにすることで、いくつかの方法を試しました。

function moveEnemy(obj) {
    obj.animate({left: "-=150"}, 2000, "linear");
}

私は実際にプロパティを取得する方法を読んだので、enemys[number][html_element] のように書き込もうとしましたが、うまくいきませんでした。パラメータ(「obj」または上記の「number」は未定義)であることを常に伝えています。

誰もその間違いを見ることができますか?D:

4

1 に答える 1

0

問題は、setIntervalスコープが変更され、thisグローバル (ウィンドウ) オブジェクトになった関数にあります。

move関数を次のように変更します。

Enemy.prototype.move = function() {
    var me = this;
    this.move_interval = setInterval(function() {moveEnemy(me.number)}, 2000);
    return this;
};
于 2013-10-25T08:19:19.883 に答える