Du solltest deinem Ball einen Richtungsvektor verpassen:
§ \begin{pmatrix} dx \\ dy \end{pmatrix}§
Dabei stellt
dx die Bewegung in x-Richtung dar und
dy analog dazu die in y-Richtung. Also wenn beides z.B. 100 wäre, dann würde sich dein Ball pro Frame um
100 * FrameTime Pixel nach rechts und um gleichen Betrag nach unten bewegen. (Wenn man den Koordinatenursprung in der linken, oberen Ecke annimmt.) So kannst du einerseits die Richtung des Balls mit Hilfe dieses Vektors festlegen und gleichzeitig auch dessen Geschwindigkeit, die abhängig von der Länge des Vektors (Pythagoras) ist.
Bei einer Kollision oben oder unten, also sozusagen auf der y-Achse, multiplizierst du einfach die y-Komponente dieses Vektors mit -1 und bei einer Kollision links oder rechts, auf der x-Achse also, machst du gleiches mit der x-Komponente des Vektors. Das ist alles. Du musst also lediglich bei der Kollisionsüberprüfung zwischen "x- & y-Kollision" unterscheiden und das Vorzeichen der entsprechenden Vektorkomponente umdrehen.
In deinem Fall könnte das so aussehen:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
if(Ball.x <= Spielfeld.x || Ball.x + Ball.width >= Spielfeld.x + Spielfeld.width) // Kollision am linken oder rechten Rand des Spielfelds (also auf x-Achse)
{
Ball_Richtungsvektor.dx *= -1;
}
if(Ball.y <= Schlaeger.y + Schlaeger.height || Ball.y + Ball.height >= Schlaeger.y) // Kollision am oberen oder unteren Rand eines Schlägers (also auf y-Achse)
{
Ball_Richtungsvektor.dy *= -1;
}
// Später den Ball bewegen
Ball.x += Ball_Richtungsvektor.dx * FrameTime;
Ball.y += Ball_Richtungsvektor.dy * FrameTime;
|
Gruß
SaRu_