2012-03-19 37 views
1

我在渲染画布时遇到了一些麻烦。其实我试图写太空侵略者的游戏,而不使用任何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

你有没有考虑使用GDI +?它是GDI顶层的面向对象层,更易于使用。有一个德尔福2009+包装在http://www.bilsen.com/gdiplus/index.shtml – 2012-03-20 01:34:46

+0

对不起,但我只拥有bordel delphi 7 – Yurgen 2012-03-21 15:55:59

回答

5

你不能写这样的标准Windows应用程序。您必须根据WM_PAINT消息进行绘画。用德尔斐术语来说,这相当于覆盖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;