作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在渲染 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;
最佳答案
您不能编写这样的标准 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;
关于德尔福, Canvas : Complicated background animation under [blinding] image,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9777793/
我是一名优秀的程序员,十分优秀!