Schießen

Mit den bisherigen Implementation können die Gegner sowohl Hindernisse erkennen und ihnen ausweichen, als sich auch in eine günstige Stellung zum Spieler begeben. Nun soll der Spieler jedoch nicht nur auf andere Schiffe schießen sondern auch von ihnen beschossen werden können. Da die Gegner jedoch nicht den Weg freischießen und somit das Spiel erleichtern sollen, ist deren einziges Ziel der Spieler.

Daher wird die zugehörige shoot-Methode nur dann aufgerufen, wenn sich der Spieler in unmittelbarer Umgebung des Gegnerschiffs befindet oder sich dieses direkt auf den Spieler zubewegt. Der Aufruf garantiert aber noch kein Auslösen eines Schusses, hierfür sind weitere Bedingungen zu erfüllen. Diese werden allerdings allesamt in der Methode geklärt.

Die shoot-Methode ist hierbei im klassischen Three.js-Stil mit Hilfe eines Raycasters und einer SphereGeometry implementiert.

Diese SphereGeometry befindet sich an der Position des Spielers und ihr Radius ist abhängig von der Schussgenauigkeit der Gegner. Da nicht nur die Schussgenauigkeit sondern auch die Schussreichweite Einfluss auf die Entscheidung hat, ob ein Schuss gesetzt werden soll, wird dem Raycaster die maximale Schussweite ebenfalls mitgeben. Der Raycaster überprüft nun aus der Position des Gegners heraus, ob ein Schuss die um den Spieler aufgespannte Kugel träfe.

var raycaster = new THREE.Raycaster(this.position,this.direction,0,maxShootDistance);
var intersects = raycaster.intersectObjects([aimSphere]);

In diesem Fall wird ein Schuss in Richtung des Spielers abgesetzt. Damit die Gegner jedoch weder eine zu hohe Genauigkeit aufweisen sowie auch der Spieler nicht durch eine leichte Bewegung schon den tötenden Schüssen entkommen kann, schießt dieser in einer ebenfalls durch die Schussgenauigkeit beeinflusste, jedoch um den Faktor 2/3 verkleinerte Kugel um den Spieler.

Schuss 1

// Ueberpruefe, ob geschossen werden darf
this.sinceLastShot += delta;
// weit weg alle 1.5s, linear interpoliert, aber hoechstens alle 0.3s schiessen
coolDownTime = 0.3 + 1.2 / maxShootDistance * this.position.distanceTo(ship.position);
if(this.sinceLastShot >= coolDownTime){
    this.sinceLastShot = 0;
    // schiesse

    enemyShootLaser(this.position,
        aimPosition.add(new THREE.Vector3(shootAccuracy * Math.random(),
            shootAccuracy * Math.random(),shootAccuracy * Math.random())));
            ...
}

Damit nun allerdings nicht bis zu 30 Schüsse die Sekunde gelöst werden, hat der Gegner, wie auch der Spieler, eine coolDownTime zu beachten. Diese dient auch dem Zweck, dass bei größerer Distanz der Schütze seltener versucht, den Spieler zu treffen, jedoch im Nahen nur noch auf Angriff fliegt. Daher ist initial eine theoretische coolDownTime von 0,3 Sekunden vorgesehen, welche aber rein hypotetisch ist. Diese würde genau dann erreicht werden, wenn Spieler und Gegner kollidiert werden. Am Rande der Schussreichweite setzt der Gegner hingegen alle 1,5 Sekunden einen Schuss ab.

results matching ""

    No results matching ""