Zitat von
Martin.Ghosts:
(zu Matze) Klar, das könnte man machen. Jedoch wird dann die Wand sehr warscheinlich nicht berührt.
Dann prüfe halt nachher und verschieb es wieder ein Stück zurück, wenn es drüberraus ging.
x := (-1) * x;? ... wie wär es mit
x := -x;
Außerdem brauchst du in einer Klassenprozedur (z.B. TForm1) nicht nochmal die Klassenvariable (z.B. Form1) angeben.
Delphi-Quellcode:
procedure TForm1.Move;
begin
Form1.Shape1.Left := Form1.Shape1.Left + x;
Form1.Shape1.Top := Form1.Shape1.Top + y;
if Form1.Shape1.Left <= 0 then begin
if Form1.Shape1.Left < 0 then Form1.Shape1.Left := 0;
x:= -x;
end else if Form1.Shape1.Left + Form1.Shape1.Width >= Form1.Width then begin
if Form1.Shape1.Left > Form1.Width - Form1.Shape1.Width then Form1.Shape1.Left := Form1.Width - Form1.Shape1.Width;
x:= -x;
end;
if Form1.Shape1.Top <= 0 then begin
if Form1.Shape1.Top < 0 then Form1.Shape1.Top := 0;
y:= -y;
end else if Form1.Shape1.Top + Form1.Shape1.Height >= Form1.Height then begin
if Form1.Shape1.Top > Form1.Height - Form1.Shape1.Height then Form1.Shape1.Top := Form1.Height - Form1.Shape1.Height;
y:= -y;
end;
end;
so isses doch bestimmt auch übersichtlicher?
Delphi-Quellcode:
procedure TForm1.Move;
begin
Shape1.Left := Shape1.Left + x;
Shape1.Top := Shape1.Top + y;
if Shape1.Left <= 0 then begin
if Shape1.Left < 0 then Shape1.Left := 0;
x:= -x;
end else if Shape1.Left + Shape1.Width >= Width then begin
if Shape1.Left > Width - Shape1.Width then Shape1.Left := Width - Shape1.Width;
x:= -x;
end;
if Shape1.Top <= 0 then begin
if Shape1.Top < 0 then Shape1.Top := 0;
y:= -y;
end else if Shape1.Top + Shape1.Height >= Height then begin
if Shape1.Top < Height - Shape1.Height then Shape1.Top := Height - Shape1.Height;
y:= -y;
end;
end;
Und wenn du jetzt noch erstmal über temporäre Variablen gehst, dann wird das Shap auch nich (falls es über'n Rand hinausging) zweimal verschoben, außerdem sind Variablen schneller, als die Setter-/Getterprozeduren (der Shape).
Delphi-Quellcode:
procedure TForm1.Move;
var x2, y2: integer;
begin
x2 := Shape1.Left + x;
y2 := Shape1.Top + y;
if x2 <= 0 then begin
if x2 < 0 then x2 := 0;
x:= -x;
end else if x2 + Shape1.Width >= Width then begin
if x2 > Width - Shape1.Width then x2 := Width - Shape1.Width;
x:= -x;
end;
if y2 <= 0 then begin
if y2 < 0 then y2 := 0;
y:= -y;
end else if y2 + Shape1.Height >= Height then begin
if y2 < Height - Shape1.Height then y2 := Height - Shape1.Height;
y:= -y;
end;
Shape1.Left := x2;
Shape1.Top := y2;
end;
So ging es auch noch:
Delphi-Quellcode:
procedure TForm1.Move;
var x2, y2: integer;
begin
x2 := Shape1.Left + x;
y2 := Shape1.Top + y;
if x2 <= 0 then begin
x2 := 0;
x:= -x;
end else if x2 + Shape1.Width >= Width then begin
x2 := Width - Shape1.Width;
x:= -x;
end;
if y2 <= 0 then begin
y2 := 0;
y:= -y;
end else if y2 + Shape1.Height >= Height then begin
y2 := Height - Shape1.Height;
y:= -y;
end;
Shape1.Left := x2;
Shape1.Top := y2;
end;
jetzt könnte man noch Fomr1.Width und Form1.Height durch Variablen ersetzen (welche in TForm1.OnCreate und eventuell noch TForm1.OnResize gesetzt werden).
Und aus Shape1.Width und Shape1.Height lassen sich schöne Konstanten machen. (schneller gehts dann wohl nicht mehr mit der Speicherverwaltung ... in
VCL)
[add]
natürlich wäre es mit der von alzaimar vorgeschlagen Schnittpunktberechnung besser, weil dann ja beide Richtungen angepasst werden, aber o gehts auch (halbwegs) ... 's wird ja jeweils nur eine der Richtungen zurückgesetzt.
Und das
LastTickCount := GetTickCount; würde ich auch gleich mal am Anfang mit machen, damit es zu keiner Zeitverschiebung kommt, da das Zeichen/verschieben auch etwas Zeit benötigt.
Delphi-Quellcode:
procedure TForm1.Move;
var x2, y2, t: integer;
dt: Cardinal;
begin
dt := GetTickCount - LastTickCount;
LastTickCount := GetTickCount;
x2 := Shape1.Left + MulDiv(x, dt, 50);
y2 := Shape1.Top + MulDiv(y, dt, 50);
if x2 <= 0 then begin
x2 := 0;
x:= -x;
end else begin
t := Width - Shape1.Width;
if x2 >= t then begin
x2 := t;
x:= -x;
end;
end;
if y2 <= 0 then begin
y2 := 0;
y:= -y;
end else begin
t := Height - Shape1.Height;
if y2 >= t then begin
y2 := t;
y:= -y;
end;
end;
Shape1.Left := x2;
Shape1.Top := y2;
end;