Vorbereitende Maßnahmen

Erzeugt werden die Gegner, wie auch die Asteroiden, in einer kernlosen Kugel.

Die Gegner sollen sich intelligent verhalten, somit insbesondere nicht miteinander kollidieren. Eine Möglichkeit wäre, jedes Objekt im Weltraum zu betrachten und zu diesem einen gewissen Abstand zu halten. Dies würde das Problem sehr hochdimensional gestalten. Daher betrachtet jeder Gegner nur die Objekte, die in einer Umgebung von drei bis fünf Sekunden Flugzeit um ihn liegen. Dies geschieht in collectObstacles. Als Hindernisse werden hierbei ausschließlich die Asteroiden und die Mitkonkurrenten gezählt, dem Spieler wird durch die move-Methode ausgewichen. Den Projektilen wird hingegen, da sonst das Spiel zu schwer werden würde, nicht ausgewichen.

Nun sind die Hindernisse, die "vor" dem Schiff liegen aufgrund der Flugrichtung gefährlicher als solche, die sich "hinter" diesem befinden. Durch das Verschieben der Kugel um einen Frame in optimaler Richtung wird diesem Rechnung getragen.

var shipPosition = this.position.clone();
optimalDir.multiplyScalar(delta*this.speed);
shipPosition.add(optimalDir);
optimalDir.normalize();

Astroiden aufsammeln

Befindet sich ein Asteroid nun in einer solchen Distanz um das Gegnerschiff, dass es ein Hindernis darstellen könnte, also in der minObstacleDistance, wird es als Hindernis markiert und somit in move beachtet. Da im Laufe des Programms sowohl auf das asteroids-Array als auch auf das enemies-Array des Öfteren zugegriffen wird, sind beide Arrays nach dem Abstand zum Spieler sortiert. Deshalb kann die Überprüfung, ob ein Objekt noch ein Hindernis darstellen könnte, abgebrochen werden, sobald sich ein Hindernis im zu weit entfernten Ring um den Spieler befindet.

for(var i = 0; i < asteroids.length; i++) { // Asteroiden schon geupdatet
    asteroid = asteroids[i];
    d = Math.abs(shipDistance - asteroid.position.distanceTo(ship.position));

    // Teste, ob im richtigen Ring um den Spieler
    // possibleObstacle um die Sortierung zu nutzen -> Doppelter switch
    if(d <= minObstacleDistance) { // nahe (in Bezug auf Distanz zum Player)
        possibleObstacle = true;
        distanceToShip = asteroid.position.distanceTo(shipPosition);
        if(distanceToShip <= minObstacleDistance) { // nahe an this
            obstacles.push(asteroid);
        }
    } else if(possibleObstacle && d > minObstacleDistance) {
        possibleObstacle = false;
        break; // da sortiert nun nur noch weiterliegende Objekte
    }

}

Da andere Gegner ebenfalls Hindernisse darstellen können, müssen auch diese gesammelt werden. Im Grundgedanken ist der Algorithmus zum Aufsammeln der hinderlichen Schiffe zu dem der Asteroiden identisch. Allerdings können die Gegner entscheiden, in welcher Richtung sie fliegen. Daher beachten die feindlichen Gegner ausschließlich die Schiffe, die in der Entfernung vom Spieler vor ihnen liegen.

Gegner aufsammeln


for(var i = 0; i < enemies.length; i++) {
    enemy = enemies[i];
    d =  enemy.position.distanceTo(ship.position) - shipDistance;
    if(d <= 0 && d <= minObstacleDistance) { // nahe und vor einem
        distanceToShip = enemy.position.distanceTo(shipPosition);
        if(distanceToShip <= minObstacleDistance && enemy!=this) { // nahe an this
            obstacles.push(enemy);
        }
    } else if(possibleObstacle && d > minObstacleDistance) {
        // nach Sortierung wieder zu weit entfernt oder hinter enemy
        possibleObstacle = false;
        break;
    }
}

results matching ""

    No results matching ""