Es arbeitet sich wesentlich besser mit einem Geschwindigkeitsvektor als mit dem Winkel
(Geschwindigkeit in x- und y-Richtung in zwei verschiedenen Variablen).
Delphi-Quellcode:
TGeschwindigeit: record
dx, dy: Double;
end;
procedure derBall.Bandenkollision;
begin
Geschwindigkeit.dy := -Geschwindigkeit.dy;
end;
procedure derBall.Schlägerkollision;
begin
Geschwindigkeit.dx := -Geschwindigkeit.dx;
end;
function derBall.bewegt_sich_nach_links : Boolean;
begin
Result := (Geschwindigkeit.dx < 0);
end;
function derBall.bewegt_sich_nach_rechts : Boolean;
begin
Result := (Geschwindigkeit.dx > 0);
end;
function derBall.bewegt_sich_nach_oben : Boolean;
begin
Result := (Geschwindigkeit.dy < 0);
end;
function derBall.bewegt_sich_nach_unten : Boolean;
begin
Result := (Geschwindigkeit.dy > 0);
end;
procedure derBall.bewegeDich;
begin
XKoordinate := XKoordinate + Geschwindigkeit.dx;
YKoordinate := YKoordinate + Geschwindigkeit.dy;
end;
Zum eigentlichen Problem:
Delphi-Quellcode:
//Kollisionssystem von Schlaeger1
if derBall.bewegt_sich_nach_links then
begin
If (derBall.XKoordinate >= Schlaeger1.XKoordinate)
and (derBall.YKoordinate >= Schlaeger1.YKoordinate)
and (derBall.YKoordinate <= (Schlaeger1.YKoordinate+Schlaeger1.Breite)) then
begin
derBall.Schlaegerkollision;
end;
end;
//Kollisionssystem von Schlaeger2
if derBall.bewegt_sich_nach_rechts then
begin
If (derBall.XKoordinate >= Schlaeger2.XKoordinate)
and (derBall.YKoordinate >= Schlaeger2.YKoordinate)
and (derBall.YKoordinate <= (Schlaeger2.YKoordinate+Schlaeger2.Laenge)) then
begin
derBall.Schlaegerkollision;
end;
end;
//Kollisionssystem von den Aussenwänden
If derBall.bewegt_sich_nach_oben then
begin
if derBall.YKoordinate <= dasFeld.gibYKoordinate then
begin
derBall.Bandenkollision;
end;
end;
//Kollisionssystem von den Aussenwänden
if derBall.bewegt_sich_nach_unten then
begin
If derBall.YKoordinate >= (dasFeld.gibYKoordinate+dasFeld.Laenge) then
begin
derBall.Bandenkollision;
end;
end;