我发现最好决定你希望运动需要多长时间,而不是使用睡眠程序。这可以更好地适应不同速度的计算机,也可以适应不同的移动距离。如果您希望它在屏幕上移动需要 1 秒,则需要在重绘之间以较小的步长移动,而在屏幕上移动只需 0.5 秒。
我不记得确切原因,但我们还添加了代码来重新绘制父级。我认为我们遇到了当我们的对象在屏幕上移动时留下重影的问题。
这是我们正在使用的代码。这是一个可以在屏幕上移动和离开的组件内部。
procedure TMyObject.ShiftRight;
var
TicksStart: int64;
StartLeftValue: integer;
EndLeftValue: integer;
NewLeftValue: integer;
LeftValueDif: integer;
RemainingTicks: int64;
begin
StartLeftValue := Self.Left;
EndLeftValue := Self.Left + Self.Width;
LeftValueDif := EndLeftValue - StartLeftValue;
TicksStart := GetTickCount();
RemainingTicks := FadeTime; // Fade Time is a constants that dermines how long the
// slide off the screen should take
while RemainingTicks > 0 do
begin
NewLeftValue := (LeftValueDif * (FadeTime - RemainingTicks)) div FadeTime;
Self.Left := Max(StartLeftValue, NewLeftValue);
Self.Parent.Repaint;
Self.Repaint;
RemainingTicks := FadeTime - int64(GetTickCount - TicksStart);
end;
if Self.Left < EndLeftValue then
Self.Left := EndLeftValue;
Self.Parent.Repaint;
Self.Repaint;
end;