Delphi, Canvas: сложная фоновая анимация под [ослепляющим] изображением - PullRequest
1 голос
/ 20 марта 2012

У меня проблемы с рендерингом холста.На самом деле я пытаюсь написать игру наподобие космических захватчиков, без использования 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 Ответ

5 голосов
/ 20 марта 2012

Вы не можете написать такое стандартное приложение для 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...