Space Invaders-Enterprise Edition

Space Invaders-Enterprise Edition
Copyright ©2012 Regents of the University of California.
For original English text, go to: http://eis-blog.ucsc.edu
Translated by A.Romanova

Arghh! Space Invaders in suits!Space Invaders Enterprise Edition

UPDATE: Ich habe einen Programmfehler mit dem ausführbaren Programm “befestigt”, sodass es nicht für Windows funktionierte. Die “Fixierung” (bemerken das fortlaufende Zitat!) sollte einfach JAR in Maven verpacken, satt in Eclipse. Seltsam! Dank derjenigen, die Fehlerberichten mit mir abgelegt haben. Und Ja, der Name ein Witz ist!

Ich bin zufrieden bekannt zu geben, dass ich Space Invaders Enterprise Edition veröffentlicht habe (Java, Programmdatei-Plattformunabhängigkeit, ~9mbs durch Drools Abhängigkeiten, Quellcode hier), das erste Prototyp-Programm von meiner kürzlich bekannt gegebenen Forschungsrichtung, Zenet.

Space Invaders EE ist ein Klon des Codes der Space Invaders vom Coke und Code, der ein javanischer Tutoren ist dafür wie man Spiele schaffen soll. Jedoch ist es nicht das selbste Spiel, dafür wir uns interessieren (obwohl es ziemlich lustig, und vielen Dank Kevins für die Freilassung seinen Code als offene Quelle!)

Die Magie der Space Invaders Enterprise Edition ist wirklich unter der Motorhaube. Ich habe die Spiellogik von der Java – Quelle in eine Datei getrennt, analysiert durch einen Regel-Engine. Das bedeutet wir können das Spieldesign betrachten, ohne es mit zu vielen Durchführungscode zu verworren.

Regel-Engine werden in Unternehmensniveau-Gesellschaften allgemein verwendet, um Dinge zu entscheiden, z.B. wie viel Ihre Autoversicherungsprämie sein wird. Wollen wir anfangen,  für mehr Spaß zu verwenden!

Eine Beschreibung dessen, wie das alles funktioniert, gibt es nach dem Sprung.

Hier gibt es ein Schnipsel von einigen Regel-Datei, geschrieben für Drools Regel-Engine:

rule “Reverse aliens if one reaches the edge of the screen”

    when
        $alien : AlienEntity()
        exists (AlienEntity(x < 10) or AlienEntity(x > 750))
    then
        $alien.setHorizontalMovement(-$alien.getHorizontalMovement());
        $alien.setY($alien.getY() + 10);
end
rule “Process bullets hitting aliens”
    when
        $shot : ShotEntity()
        $alien : AlienEntity(this != $shot, eval($shot.collidesWith($alien)))
        $otherAlien : AlienEntity()
    then
        game.getEntities().remove($shot);
        game.getEntities().remove($alien);
        $otherAlien.setHorizontalMovement($otherAlien.getHorizontalMovement() * 1.04);
end
rule “End the game when all aliens are killed”
    salience 1
    when
        not AlienEntity()
        exists ShipEntity()
    then
        game.notifyWin();
        game.getEntities().clear();
end
rule “End the game when an alien reaches the bottom”
    when
        exists AlienEntity(y > 570)
    then
        game.notifyDeath();
        game.getEntities().clear();
end

This Gist brought to you by GitHub.         SpaceInvaders.java    view raw

Hoffentlich das ist eine Sorte von lesbaren, sogar für den Nicht-Programmierer dorthinaus. Wollen wir mit der ersten Regel anfangen, die die Ausländer umkehrt. Die Ausländer setzen standardmäßig fort, jede Zecke ein bestimmter Betrag horizontal zu bewegen. Die Regel sagt “finden mich einen Ausländer, wo es einen Ausländer irgendwo im Spiel gibt, das den Rand des Schirms geschlagen hat. Dann tauschen die Bewegungsrichtung des Ausländers und es bei 10 Pixel herunterlässt.” Die Regel wiederholt sich für alle Ausländer im Spiel, schließlich auf jedem angezündet werden und die Richtung für sie alle umkehrend.

Um zu helfen, den Wert davon zu illustrieren, vergleichen Sie die “Prozess-Kugeln schlagen die Ausländer” den Code zum Original:

for (int p=0;p<entities.size();p++) {
for (int s=p+1;s<entities.size();s++) {
Entity me = (Entity) entities.get(p);
Entity him = (Entity) entities.get(s);
if (me.collidesWith(him)) {
me.collidedWith(him);
him.collidedWith(me);
}
}
}

This Gist brought to you by GitHub. BulletCollision.java view raw

Autsch! Nicht sehr lesbar! Leider ein solcher Code ist üblich und in der Spielprogrammierung unvermeidlich. Was geschieht dann hier? So, der Code hat zwei Schleifen. Die erste Schleife bekommt alle Gegenstände im Spiel. Die zweite Schleife macht dasselbe. Wenn das erste Element der ersten Schleife versucht wird, prüft es dann diesen Gegenstand gegen alle anderen Gegenstände im Spiel zu sehen, ob sie kollidiert haben. Schließlich werden alle Gegenstände im Spiel gegen einander geprüft. Wenn sie wirklich kollidieren, gibt es einen Code anderswohin, damit zu entscheiden, was man machen soll (eine Kugel und einen Ausländer kollidieren Ergebnisse darauf, beide aus dem Spiel entfernt werden).

Das ist genau dasselbe Verhalten beim Benutzer sichtbaren Niveau (Danke Andrew für die Erläuterung), weil der Kollisionscode sich in der Regel-Datei befindet. Ich bevorzuge vielmehr die Regel-Engine Durchführung, und ich hoffe, werden Sie auch machen. Doppelte Schleifen sind für Programmierer hart genug, ganz zu schweigen von Spielentwerfern zu verstehen, die wir nicht annehmen können, sind im Stande alle Nüsse und Bolzen der modernen Spielprogrammierung zu verstehen (der sehr schwierig ist).

Space Invaders Enterprise Edition bietet eine verschiedene Annäherung an. Indem wir die Spiellogik von der Durchführung trennen, haben wir eine Spieldesignspezifizierung, die wir zu Programmierern und Spielentwerfern geben können, die wir leicht lesen und im Stande sein können, irgendwelche Programmfehler darin zu entdecken. Versuchen Sie, einen Programmfehler in diesem doppelten Schleife-Code zu entdecken!

Ich habe noch nicht sogar begonnen, die Oberfläche der Macht Drools Regel-Engine zu kratzen. Das ist für einen anderen Pfosten, und was bildet die Basis von Zenet Projekt, dass ich daran arbeite. Es gibt mehr noch damit zu erfahren! Das war noch nicht alles!

Wie bei allen meiner ganzen bekannt gegebenen Arbeit ist der Code quelloffenes laut der BSD-Lizenz, so können Sie sehen wie funktioniert das, modifizieren Sie es und veröffentlichen Sie es ohne jede Beschränkung überhaupt wieder. Es wird alles beim GitHub veranstaltet. Es ist leicht mit Maven zu bilden, und sobald Sie auf die Beine bringen, versuchen Sie einige der Regeln zu ändern, oder neue hinzuzufügen, und sehen Sie wie leicht das wirklich ist.

Über den Autor: Chris Lewis ist ein britischer PhD Student der Schnittpunkt der Softwaretechnik und Videospiel-Entwicklung. Lesen Sie mehr über diesen Autor