Delphi,Canvas:[致盲]图像下的复杂背景动画

时间:2012-03-19 20:55:09

标签: delphi animation canvas

渲染画布时遇到了一些麻烦。实际上我正试图像空间入侵者一样编写游戏,而不使用任何OpenGL或DirectX。所以在背景中我有移动的天空,并且喷射在它上面移动。但喷气机是致盲的,天空不均匀。这是我的代码

  sky := TBitmap.Create;
  sky.LoadFromFile('sky.bmp');
  jet := TBitmap.Create;
  jet.LoadFromFile('jet.bmp');
  jet.Transparent := True;

  while True do
  begin
       for k := 0 to sky.Height do
       begin
          for i := -1 to (pbMain.Height div sky.Height) do
          begin
                for j := 0 to (pbMain.Width div sky.Width) do
                begin
                    pbMain.Canvas.Draw(nx, ny, jet);
                    pbMain.Canvas.Draw(j*sky.Width, k + i*sky.Height, sky);
                end;
                Application.ProcessMessages;
          end;
          Sleep(1);
       end;
  end;

谢谢。

1 个答案:

答案 0 :(得分:5)

你无法编写像这样的标准Windows应用程序。您必须根据WM_PAINT消息进行绘画。在Delphi术语中,这等同于覆盖Paint后代的TWinControl方法,或者可能使用TPaintBox并提供OnPaint事件处理程序。我假设您使用TPaintBox

如果你需要避免闪烁,通常的做法是绘制一个离屏位图,然后在要求你画画时显示它。

您的应用程序应该使用定时器控件来提供常规脉冲。然后,在每个脉冲上,更新您的屏幕外位图。然后在您的颜料盒上调用Invalidate以强制进行绘画循环。

代码可能如下所示:

procedure TMainForm.RefreshTimerTimer(Sender: TObject);
begin
  RedrawOffscreenBitmap;
  PaintBox.Invalidate;
end;

procedure TMainForm.RedrawOffscreenBitmap;
begin
  //paint to FOffscreenBitmap
end;

procedure TMainForm.PaintBoxBox(Sender: TObject);
begin
  PaintBox.Canvas.Draw(0, 0, FOffscreenBitmap);
end;