Ich an deiner Stelle würde die Verschiebung des Balles mit Sinus und Kosinus erledigen... Braucht man allerdings an kleinen Umweg:
Delphi-Quellcode:
var x,y,angle:Single; //globale Variablen
//Der Winkel ist im Bogenmaß anzugeben...
procedure TForm1.Timer1OnTimer(...);
(...)
begin
(...)
x:=x+cos(angle);
y:=y+sin(angle);
Ball.Top:=Trunc(y); //Es geht auch Round(y)
Ball.Left:=Trunc(x);
(...)
end;
Und die Sache mit dem Abprallwinkel machst du abhängig davon, wie weit der Ball von der Mitte des Schlägers entfernt aufkommt... zB:
Delphi-Quellcode:
//wir sind in der Timer Prozedur
//Als Beispiel: der Ball kommt von links an den rechten Schläger
if Ball.Left+Ball.Width=Shape2.Left then begin //Ball trifft Schläger
if (Ball.Top+Ball.Height>=Shape2.Top) and (Ball.Top<=Shape2.Top+Shape2.Height) then begin
//Ball ist auf Höhe des Schlägers
//Berechnung des neuen Winkels
angle:=angle+pi/2*((Shape.Top+Shape.Height/2)-(Ball.Top+Ball.Height/2))/10;
//Ist jetzt nur ein Beispiel...
end;
end;
//Hier dann die Positionsberechnung von oben
So müsste es in groben Zügen funktionieren... Habs jetzt grad net ausgetestet, du musst aber vermutlich ein bisschen mit den Zahlen rumspielen
Falls du Sin(x) und Cos(x) nicht finden kannst, binde die Math
Unit ein...