Thema: Delphi Timer.Interval<1

Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.079 Beiträge
 
Delphi 12 Athens
 
#17

Re: Timer.Interval<1

  Alt 9. Jun 2006, 17:17
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;
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat