I wanna be the Airman – Coding in Processing

Programmierung des Spiels I wanna be the Airman in ProcessingZahlen und Daten, zusammengemischt mit Fakten, ergeben eine außerordentlich gute Spielsuppe?! Nach der Konzeption und den richtigen Ideen, ist ein Spiel wie »I wanna be the Airman« noch lange nicht fertig. Jetzt muss jede einzelne Handlung, jeder Frame, jede visuelle Wahrnehmung programmiert werden. Nur wenn alle Befehle stehen, kann ein Game überhaupt entstehen. Was muss alles definiert werden…?

Im zweiten Teil meiner Artikelserie bzw. meines Entwickler-Tagebuchs geht es darum, welche Codes für das fertige Spiel benötigt werden, um es laufen zu lassen und es funktionstüchtig, mit all seinen Facetten und Funktionen, zu machen.
Wie im ersten Artikel zum Konzept bereits erläutert, war der Grundbaustein die in der Bibliothek bereits verfügbare Flock-Applikation, in der lediglich Dreiecke durch die Luft flogen. Diese Anwendung basiert auf zwei verschiedene Code-Listen: Die erste bestimmt, dass es überhaupt »Flocks« gibt und das diese durch die Gegend fliegen. Der zweite Code dagegen bestimmt den Startpunkt, die Größe, sowie die Geschwindigkeit. Außerdem ist ein wichtiger Punkt, die Koordinaten jedes einzelnen Dreiecks zu definieren, um so eine exakte Position auslesen zu können. Ich zeige euch einen Teil des Codes, der die Positionierung ausfindig macht:

void update() {
// Update velocity
vel.add(acc);
// Limit speed
vel.limit(maxspeed);
loc.add(vel);
// Reset accelertion to 0 each cycle
acc.mult(0);
}

void seek(PVector target) {
acc.add(steer(target,false));
}

void arrive(PVector target) {
acc.add(steer(target,true));
}

Damit wäre ein wichtiger Teil bereits abgeschlossen. Aber wir wollen, dass die Maus integriert wird und als Spielelement fungiert. Im Endeffekt: Wird die Computermaus durch ein Flock-Element getroffen, muss etwas passieren, beispielsweise ein Game Over. Das bedeutet also, das unser Programmcode den Reiter »void hit(){« in sich tragen muss. Dieser bestimmt die Aktion, die durchgeführt wird, wenn wir getroffen werden. Damit das funktioniert, müssen die Koordinaten der Maus eingebaut werden. Kommt also eines der Elemente in die Nähe der Maus (die mit mouseX und mouseY für die Position bestimmt wird), so kommt es zu einem Konflikt und eine Aktion wird gestartet.

if (dist(loc.x,loc.y, mouseX, mouseY)<20){
hit();
// float d = dist(50, 50, mouseX, mouseY)
}

Das »if« bestimmt, dass WENN ein Dreieck den Standort der Maus, mit einem Abstand von 50 Pixel in Höhe und Breite, erfasst, geschieht etwas. Wenn das nicht der Fall ist, passiert nichts, was außerdem mit einem »else« definiert werden kann.

Damit wäre das Spiel bereits auch fertig… sieht nur etwas dezent gestaltet und merkwürdig aus. Ein weiterer Punkt ist das Spiel selbst – wird der Spieler direkt nach dem Start des Programms ins Geschehen geworfen oder existiert sowas wie ein »Startbildschirm«. Das ist ein wichtiger Grundgedanke, der in das Konzept mit einfließt. I wanna be the Airman braucht als recht kleine Applikation nur 3 verschiedene Frames oder Standorte. Ein Startbildschirm, das Spielgeschehen selbst und ein Frame der angezeigt wird, sobald die Spielfigur getroffen ist – ein Game Over Bild. Allein diese Überlegung strukturierte den Code und ließ weitere Gedanken zur Programmierung ermöglichen.

Wir bauen das Spiel einfach in mehreren Schachteln auf und definieren jeden einzelnen Bereich extra. Dazu kann in Processing die Funktion »Case« genutzt werden. Cases können wir folgt aussehen:

char level = ‚B‘;

switch(level) {
case ‚A‘:
println(„Start“);
break;
case ‚B‘:
println(„Spielgeschehen“); //
break;
case ‚C‘:
println(„Game Over“); // D
break;
}

In jedem Case wird bestimmt, was angezeigt wird und welche Funktionen aktiv sind, beendet wird es durch ein Break, daraufhin folgt das nächste Case. Alles, was außerhalb eines Cases steht, wird in jedem Segment aktiv und funktioniert immer. Für das Game bedeutet das konkret: In Case ‚A‘ wird der Startbildschirm geöffnet, auf dem sowas wie »Drücke Start um zu spielen« stehen könnte. Der Codeschnipsel »println« gibt lediglich für die Bearbeitung bei der Programmierung an, das es funktioniert. In zweiten Bereich (‚B‘) werden die Anwendungen der fliegenden Flocks sowie die Maus selbst aktiv, um die Applikation spielen zu können. Zum Schluss wird in Case ‚C‘ bestimmt, das wir Game Over sind und das Spiel vorbei ist.

Aber wie bewegen wir uns zwischen den drei Elementen? Wie vorhin bereits erwähnt, stehen alle Funktionen, die außerhalb der Cases stehen, jederzeit zur Verfügung. Ein Spielelement, das zum nächsten Bereich springt, ist der Code »mousePressed«

if(mousePressed) {
flock = new Flock();
// Add an initial set of boids into the system
for (int i = 0; i < 300; i++) {
flock.addBoid(new Boid(new PVector(width/2,height/2), 3.0, 0.05));
}

Das ist auch schon alles, es muss nur an der richtigen Stelle stehen. Wer gerne Musik verwenden möchte, kann mit der Minim-Library für Processing auch die einzelnen Segmente mit ein wenig Sound versehen – das bringt direkt noch einen speziellen Kick ;)

Das Game ist spielbar, sieht jedoch optisch nicht so toll aus…
Im nächsten Artikel beschäftigen wir uns mit der visuellen Wahrnehmung von

I wanna be the Airman.

Veröffentlicht von

Thomas Noschka

Hallo, ich bin Thomas – Blogger, Grafik- und Interface Designer. Ich skate gerne, trinke Tee, reise oft und sehe das Internet als große Spielwiese an. Wenn du mehr über mich wissen möchtest, dann besuche mich auf Twitter, Facebook, Google+ und YouTube

4 Gedanken zu „I wanna be the Airman – Coding in Processing“

  1. OH GOTT nicht noch eins von den Dinger O.o Ich finde die I wanna be… Serie wird immer schlechter :( das erste spiel war erst richtig geil und dann baut es immer mehr ab -.-

  2. @DennisS
    Es wird ja kein „I wanna be the Guy“-Klon sondern einer von „Bob-omb“ nur eben im Style von IWBTG.

    @Tex
    Du hattest in deiner letzten Antwort im alten Artikel geschrieben, dass es sich durch die Anzahl der Projektile von „Bob-omb“ unterscheiden wird.
    Bei „Bob-omb“ steigt die Anzahl der Projektile mit der Zeit an, dort kann ich also keinen Unterschied sehen. Eventuell meinst du ja auch mit der „Anzahl an Projektilen“ nicht die Anzahl auf dem Bildschirm sondern vielleicht verschiedene Projektilarten die sich anders verhalten.
    Also vielleicht sowas wie:
    1. zufällig fliegende Dreiecke (normal)
    2. explodierende Dreiecke, die sich in mehrere kleinere Dreiecke aufteilen (mit steigendem Level)
    3. zielsuchende Dreiecke die man in Hindernisse leiten muss um sie zu zerstören
    usw.
    Kommt das so in etwa hin?

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.