2012-03-19 2 views
1

내 캔버스 렌더링에 문제가 있습니다. 실제로 저는 OpenGL이나 DirectX를 사용하지 않고 우주 침략자와 같은 게임을 작성하려고합니다. 그래서 배경을 나는 하늘을 움직이고 그것 위로 움직이는 제트기를 가지고 있습니다. 그러나 제트기는 눈을 멀게하고 하늘은 일정하게 움직이지 않습니다. 내 코드는 여기Delphi, Canvas : [블라 인딩] 이미지에서 복잡한 배경 애니메이션

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 –

+0

미안하지만, 나는 단지 borlad delphi 7을 소유하고 있습니다. – Yurgen

답변

5

그런 표준 Windows 응용 프로그램을 작성할 수 없습니다. WM_PAINT 메시지에 대한 응답으로 페인팅을해야합니다. 델파이 용어에서 이것은 TWinControl 자손의 Paint 메소드를 오버라이드하거나 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; 
관련 문제