0

なのでHTML5とJavaScriptを使ったゲームを頑張っています。スペース インベーダー スタイルのゲームを作成しようとしていますが、その結果、敵がたくさんいます。敵の配列を作成し、それらを画面に描画し、敵を移動し、最終的にそれらを削除するための専用の関数を個別に用意しています。ただし、敵の除去は問題を引き起こしています。これは、敵のヘルスが 0 以下の場合、アレイから敵を削除し、アレイの長さを 1 だけ縮小する場合の私のロジックです。配列の長さが短くなり、これがまさに私の問題であるため、配列の開始点が非常に低く、私のコードを見てください。

function hostile(x, y) {
    this.speed = 1;
    this.health = 100;
    this.x = x;
    this.y = y;
    this.height = 32;
    this.width = 32;
    this.isDead = false;
    this.direction = 0;
    this.deadCount = 0;
    this.firing = false;
    //this.moving = true;
    this.move = function () {

        if (this.isDead === false && gameStart === true) {
            context.clearRect(0, 0, canvas1.width, canvas1.height);
            if (this.x > canvas.width - 64) {

                this.y += 10;
                this.direction = 0;
            }
            if (this.x < 0) {
                this.y += 10;

            }

            if (this.direction === 1) {
                this.x += this.speed;
            } else {
                this.x -= this.speed;

            }

            if (this.x < 0) {
                this.direction = 1;
            }

            if (this.y > 420) {
                this.x = 600;
            }
        }

    };

    this.draw = function () {

        context.drawImage(sprite, 0, 480, 65, 68, this.x, this.y, 65, 65);
    };
    this.reset = function () {
        context.clearRect(this.x, this.y, 65, 65);
        this.x = 20;
        this.y = 20;
        this.health = 100;
    };
};
var enemylist = [];

function createEnemies() {
    for (var i = 0; i < 6; i++) {
        enemylist.push(new hostile(75 * i, 20));

    }
};

function deleteEnemy(a) {
    enemylist.splice(a);
    enemyBulletList.splice(a);

    //enemylist.length  = enemylist.length-1;
    //enemyBulletList.length = enemyBulletList.length - 1;
};

createEnemies();

function moveEnemies() {
    for (var i = 0; i < enemylist.length; i++) {
        if (enemylist[i].isDead === false && gameStart === true) {

            if (enemylist[i].x > canvas.width - 64) {

                enemylist[i].y += 10;
                enemylist[i].direction = 0;
            }
            if (enemylist[i].x < 0) {
                enemylist[i].y += 10;

            }

            if (enemylist[i].direction === 1) {
                enemylist[i].x += enemylist[i].speed;
            } else {
                enemylist[i].x -= enemylist[i].speed;

            }

            if (enemylist[i].x < 0) {
                enemylist[i].direction = 1;
            }

            if (enemylist[i].y > 420) {
                enemylist[i].x = 600;
            }
        }
    }
};

私の問題を説明するために、アレイから敵を撃って殺すことができます。これにより、敵も画面から削除されます。ただし、アレイの最初から敵を撃つと、すべての敵が画面から消えてゲームがクラッシュします。さらに詳しい情報が必要な場合は、お気軽にお問い合わせください。

リクエストにより、質問に関連するコードをさらに提出しました。上記のコードには、敵対的な機能とそれに直接関連するその他の機能が含まれています。

編集: Vitim.us は私の質問に関して非常に役立つヒントを提供していました。彼は、何らかのフラグ (var dead = false/true など) を作成することを提案しました。値が変更されると、特定のインスタンスを画面から簡単に削除できます。プレイヤーから離れます。

4

2 に答える 2

2

そのような配列を手動で更新しないでください。delete名前付きプロパティを削除するためのものです。から要素を削除する場合は、次Arrayを使用しますsplice

function deleteEnemy(a) { // capitalized functions are usually reserved for constructors
    enemylist.splice(a);
    enemyBulletList.splice(a);  
}

また、var enemylist = [6]あなたが思っていることをしません。単一の要素を持つ配列を作成します[6]。空の配列を作成しenemylist.push(new hostile(...))てから、それらを配列に追加する必要があります。

これにより、長さを手動で設定する必要がなくなります (これは行う必要はありません)。

于 2013-10-31T15:29:58.377 に答える