Den Ball im Spielfeld halten

Nachdem wir nun einen Ball ohne Bildschirmflackern über das Spielfeld bewegen können, berherschen wir im Grunde die beiden wichtigsten Grundtechniken zum Programmieren von Spielen mit Animationen. Wir wenden uns also nun einer wichtigen Technik zu, die allerdings nicht mehr durch ein Standardverfahren zu realisieren ist, sondern auf jede Spielsituation speziel zugeschnitten sein muss (natürlich kann man, hat man die Idee einmal gehabt bzw. irgendwo gesehen, immer wieder in ähnlichen Situationen darauf zurückgreifen!). In unseren letzten beiden Programmstücken laüft der Ball lediglich einmal über das Spielfeld. Angenommen wir wollten aber verhindern dass der Ball das Spielfeld verlässt. Stattdessen soll er, hat er den Rand des Spielfeldes erreicht, einfach in die entgegengesetzte Richtung abprallen. Was also müssten wir tun? Am besten wäre es nun natürlich, wenn ihr euch dieses Problem selbst überlegen und es dann auf eure Weise lösen würdet, denn es gibt mit Sicherheit mehr als nur eine Lösung dafür. Im Folgenden erfahrt ihr meinen Lösungsansatz, als Grundlage dient wieder das Ball - Applet, diesmal in der überarbeiteten Version mit Doppelpufferung.

Ballbewegung in verschiedene x - Richtungen

Zunächst müssen wir uns klar machen, wie wir den Ball im ersten Kapitel bewegt haben. Wir haben in jedem Durchlauf des Threads die x - Position des Balles um eins erhöht und den Ball an der neuen Stelle erneut gezeichnet. Wir haben also, ohne es zu wissen, einen Geschwindigkeitsvektor in x - Richtung verwendet, immer wenn wir mit x_pos ++ die x - Position verändert haben. Daher können wir auch explizit eine Variable x_speed definieren, die die Geschwindigkeit in x - Richtung angibt und diese mit dem Aufruf von x_pos += x_speed zu x_pos hinzuzählen. Wenn x_speed dabei den Wert 1 hat, so erhöht sich die x - Koordinate des Balles bei jedem Durchlauf um den Wert 1, der Ball bewegt sich also von links nach rechts. Um die Richtung der Ballbewegung umzukehren, müssen wir der Variable x_speed nur den Wert -1 zuweisen. Somit wird die x - Koordinate des Balles in jedem Threaddurchlauf um 1 erniedrigt und der Ball bewegt sich von rechts nach links.

Nachdem wir die Richtung der Ballbewegung nun umkehren können, ist es nur noch notwendig, zu testen, wann eine Umkehrung der Richtung notwendig wird. Dies erreichen wir mit folgendem Programmstück, das wir in die run - Methode unseres Programmes einfügen.

// Wenn der Ball den rechten Rand berührt, dann prallt er ab
if (x_pos > appletsize_x - radius)
{ }
// Ball brührt linken Rand und prallt ab
else if (x_pos < radius)
{ }

Wir bestimmen also in jedem Durchlauf, ob die x - Position des Balles größer als der rechte Rand bzw. kleiner als der linke Rand wird. Ist dies der Fall, so ändern wir den Richtungsvektor x_speed des Balles und kehren somit die Bewegungsrichtung des Balles um.
Vielleicht fragt ihr euch nun, warum ich den Radius mit einbeziehe. Die x - Koordinate des Balles ist seine Mitte, also ist die rechte bzw. linke Koordinate um den Radius des Balles größer bzw. kleiner. Damit der Ball nicht erst vom Rand abprallt, wenn er den Rand schon zur Hälfte überschritten hat, sondern schon wenn er den Rand berührt, darf seine x - Position bei einer Appletgröße von 300 und einem Radius von 20 höchstens 280 bzw. 20 betragen, damit es so aussieht, als würde er direkt vom Rand zurückgeschossen.

Ball auf die andere Seite "beamen"

Wenn man das Prinzip der Abfrage nach der Position des Balles einmal verstanden hat, kann man natürlich viele andere Sachen implementieren. Um den Ball, nachdem er auf der einen Seite verschwunden ist auf der anderen wieder auftauchen zu lassen, genügt eine einzige Abfrage und diesmal die Veränderung der x - Position:

// Test ob Ball Spielfeld ganz verlassen hat if (x_pos > appletsize_x + radius)
{}

Später werde ich noch auf die Bewegung eines Balles in x und y Richtung, also in der Ebene eingehen, was allerdings, hat man das Prinzip mit den Richtungsvektoren verstanden, sehr einfach ist. Man muss lediglich einen Vektor in y - Richtung einfügen und die y - Position zusammen mit der x - Position in jedem Threaddurchlauf verändern. Die Abfragen nach der Position gestallten sich ebenfalls nur geringfügig komplizierter. Wer will kann ja schon mal ein Applet programmieren, in dem der Ball nach allen Richtungen fliegen und von allen Wänden abprallen kann.

SourceCode BallReverse download
SourceCode Programmcode BallBeamen download
Applet Ball Reverse ansehen
Applet Ball Beamen ansehen

Nächstes Kapitel

Einbinden von Sounddateien in Applets