Ich habe das jetzt bei mir so gelöst:
Delphi-Quellcode:
var
px,py:Integer;
begin
if BallMove then begin
if b_t +1 >=20 then begin
b_t:=0;
if Hori = cLeft then
px:=Ball.Left-p_Hori.x
else
px:=Ball.Left+p_Hori.x;
if Verti = cDown then
py:=Ball.top+P_Verti.y
else
py:=Ball.top-P_Verti.y;
if Engine.SpriteManger.N_Collision(px,py,ball,false,false) <> NIL then begin
Hori:=not Hori;
Verti:=not Verti;
P_Verti:=Point(0,random(10)+1);
p_Hori:=Point(random(10)+1,0);
if Hori = cLeft then
px:=Ball.Left-p_Hori.x
else
px:=Ball.Left+p_Hori.x;
if Verti = cDown then
py:=Ball.top+P_Verti.y
else
py:=Ball.top-P_Verti.y;
end;
ball.Left:=px; ball.Top:=py;
ball.DrawSprite;
end
else
inc(b_t);
end;
Dieser Code wird in einem Timer ausgeführt. Darum habe ich eine zeitschleife verwendet.
Das Prinzip klappt eigentlich recht gut. Es sind Integer zahlen. Das reicht. Der ball fliegt jetzt nicht mehr vorhersehbar. Bei allen anderen BreakOut Varianten die ich erstellt habe, flog der ball eigentlich immer vorhersehbar
p_Hori. und p_Verti sind im Moment TPoints, aber ich glaube das ändere ich noch in Integer.
(Ich nutzte meine eigene Engine, hier und nicht die Andorra)