Swing Copters Klon selbst programmieren – so geht’s [4]

    0

Wir zeigen Euch, wie Ihr Euren Swing Copters Klon programmieren könnt. Nach Teil 1, 2 und 3 heute Teil 4 – die Kollision.

Dieser Teil erfordert die meiste geistige Anstrengung, da Processing an sich keine wirkliche Kollisionserkennung bietet. Also müssen wir uns selbst eine bauen. Hört sich kompliziert an, ist aber in Wahrheit auch keine Hexerei. Zum besseren Verständnis hilft in diesem Fall eine kleine Zeichnung:

Swing Copters Klon Schritt 4_1

Wann findet also eine Kollision statt? Die Y Position des Flugobjekts muss größer gleich der des Hindernisses sein und kleiner gleich der des Hindernisses + der Höhe des Hindernisses. Somit wird dann erkannt, dass sich das Flugobjekt auf der richtigen Höhe befindet. Bei der X Position verhält es sich ähnlich, aber etwas komplizierter: Hier findet können wir einen Punkt vergeben, wenn die X Position des Hindernisses + seine Länge kleiner als die X Position des Flugobjekts ist und die X Position des Hindernisses + seine Länge + die Größe der Lücke größer ist, als die X Position des Flugbojekts + seine Länge. Viele Zahlen in der Theorie – die Praxis sieht so aus:

void getTouched()
{
if(obstacleA.yPos+obstacleA.obstacleHeight>=Protagonist.yPos && obstacleA.yPos<=Protagonist.yPos)
{
if(obstacleA.xPos+obstacleA.obstacleLength<Protagonist.xPos && obstacleA.xPos+obstacleA.obstacleLength+obstacleA.gap>Protagonist.xPos+Protagonist.sizeX)
{Score++;}
else
{
gameOver=true;
}
}
if(obstacleB.yPos+obstacleB.obstacleHeight>=Protagonist.yPos && obstacleB.yPos<=Protagonist.yPos)
{
if(obstacleB.xPos+obstacleB.obstacleLength<Protagonist.xPos && obstacleB.xPos+obstacleB.obstacleLength+obstacleB.gap>Protagonist.xPos+Protagonist.sizeX)
{Score++;}
else
{
gameOver=true;
}
}
if(obstacleC.yPos+obstacleC.obstacleHeight>=Protagonist.yPos && obstacleC.yPos<=Protagonist.yPos)
{
if(obstacleC.xPos+obstacleC.obstacleLength<Protagonist.xPos && obstacleC.xPos+obstacleC.obstacleLength+obstacleC.gap>Protagonist.xPos+Protagonist.sizeX)
{Score++;}
else
{
gameOver=true;
}
}
}

Wir haben unten im Haupt-Tab eine Methode getTouched() erstellt. Diese führt nun all diese Rechenoperationen durch. Hier tauchen nun auch drei neue Variablen auch: gameOver, Score und Protagonist.sizeX. Um diese verwenden zu können, werden erst ganz oben noch diese Zeilen hinzugefügt:

Boolean gameOver = false;
int Score=0;

Die Anfangspunktezahl ist also 0 und standardmäßig sind wir nicht Game Over. Außerdem muss in den Flyer Tab noch diese Zeile:

int sizeX;

Welche in der Funktion init() festgelegt wird, indem Ihr diese Zeile anhängt:

sizeX = img.width;

Damit Game Over nicht nur einen symbolischen Wert hat, muss die draw() Funktion noch etwas angepasst werden. Fügt also hinter die Zeile background(0,125,125); folgendes hinzu:

if(!gameOver){

Und ganz unten in die Methode dann noch dies:

}
else
{

}

In die Klammern nach else können wir etwas schreiben wie „Game Over – erneut versuchen?“. Vorerst reichen diese Zeilen:

textSize(50);
text(„Game Over“,50,50);

Das zeigt den Text „Game Over“ in der Schriftgröße 50 an. Außerdem soll das Spiel ja nachprüfen, ob Ihr etwas berührt – also fügt Ihr ganz unten in die if(!gameOver) Abfrage noch diese Zeile hinzu:

getTouched();

Nun können wir endlich auch dafür sorgen, dass das Flugobjekt nicht mehr hängen bleibt, wenn wir den Rand berühren. Also öffnet Ihr erst einmal den Tab Flyer. Und ändert einmal den Text void move() in boolean move() um. So lässt sich nämlich leicht feststellen, ob sich das Flugobjekt bewegen kann. Ändert die Funktion jetzt derart, dass sie so aussieht:

boolean move()
{
if(xPos>=0 && xPos+sizeX <= width)
{
if(moveRight)
{
xPos+=speed;
}
else
{
xPos-=speed;
}
return true;
}
else
{return false;}
}

Damit die Änderungen auch tatsächlich genutzt werden, müssen wir im Haupt-Tab die draw() Funktion noch etwas anpassen. Aus dem alten

Protagonist.show();
Protagonist.move();

wird nun:

if(!Protagonist.move()){gameOver=true;}
Protagonist.show();

Kann er sich nicht mehr bewegen, wird das Spiel beendet und auf Game Over gesetzt. Um das Spiel neu zu starten, wird nur eine kleine Anpassung in der mousePressed() Methode fällig. Diese sollte dann so aussehen:

void mousePressed()
{
Protagonist.changeDirection();
if(gameOver){restartGame();}
}

Bevor wir für heute fertig sind, müssen wir nur noch die Funktion restartGame() erstellen. Diese sieht so aus:

void restartGame()
{
obstacleA.init();
obstacleB.init();
obstacleC.init();

runningTime=0;
Score=0;

Protagonist.init();

gameOver=false;
}

Swing Copters Klon Schritt 4_2

Eine kleine Anpassung fehlt: Begebt Euch noch kurz in den Flyer Tab und passt die init() Funktion an, dass sie so aussieht:

void init()
{
img=loadImage(„Flyer.png“);

xPos = 50;
yPos = 500;
moveRight? true;
}

Einfach und einleuchtend, oder? Jetzt ist das Spielprinzip des Originals schon sehr gut zu erkennen. Das nächste Mal kümmern wir uns dann darum, dass die Highscores angezeigt und auch gespeichert werden. Bis dahin könnt Ihr den aktuellen Fortschritt des Projekts hier herunterladen.

Teile
in diesem Artikel

Anzeige

Deine Meinung ist wichtig

Die Kommentarfunktion von Disqus wird als Frame eingebunden. Wenn Sie eine Meinung/einen Kommentar abgeben wollen, verlassen Sie damit unsere Webseite/App und posten über Disqus.