【问题标题】:Why does the image collision causes flashings?为什么图像碰撞会导致闪烁?
【发布时间】:2015-05-30 21:40:49
【问题描述】:

好吧,首先我只是在玩 delphi,而且对它还是很陌生,但我注意到每当我尝试制作某种游戏时,按钮都是 W、A、S 和 D移动一个物体(TImage),它开始随机闪烁,我注意到如果速度很快,或者当它移动并且后面有另一个图像(背景)时会发生这种情况......

我的大部分“移动”代码如下所示:

if key = 's' then begin
for I := 1 to 5 do
    sleep(1);
    x:=x-2;
    Image1.Top := x;
 end;

也许这会导致它,但它仍然真的很烦人。如果您能对此提供帮助,我将非常高兴。

【问题讨论】:

  • 从根本上说,您的整个方法都是错误的。图像控件并不打算用作精灵。对睡眠的调用也不好。您需要一种完全不同风格的游戏架构。
  • @Coldus:如前所述,TImage 和 TPaintBox 对此并不好。检查 GDI+,这对您的目的非常有用。
  • 或者您可以检查一些现有的基于游戏的图形引擎,甚至是游戏引擎。对于快速原型设计,您可以查看 unDelphiX (micrel.cz/Dx),它是为 Delphi 编写的简单图形引擎,它围绕 DirectX 实现出色的性能。如果您决定使用它,请注意:双击作为 DelphiX 版本的 Timer 的 TDXTimer 不会像使用经典 Delphi 计时器那样创建 OnTimer 事件方法,而是使用 OnActivate 方法。这是 DelphiX 的新用户通常面临的最常见问题:-)
  • 如果你真的对游戏开发感兴趣,你可以加入我们pascalgamedevelopment.com

标签: image delphi png flashing


【解决方案1】:

这样的事情最好使用TPaintBox 来处理。

让击键根据需要设置变量,然后在操作系统准备好时调用TPaintBox.Invalidate() 触发重绘。

然后TPaintBox.OnPaint 事件处理程序可以根据需要在当前变量值指定的适当坐标处绘制TGraphic

var
  X: Integer = 0;
  Y: Integer = 0;

procedure TMyForm.KeyPress(Sender: TObject; var Key: Char);
begin
  case Key of
    'W': begin
      Dec(Y, 2);
      PaintBox.Invalidate;
    end;
    'A': begin
      Dec(X, 2);
      PaintBox.Invalidate;
    end;
    'S': begin
      Inc(Y, 2);
      PaintBox.Invalidate;
    end;
    'D': begin
      Inc(X, 2);
      PaintBox.Invalidate;
    end;
  end;
end;

procedure TMyForm.PaintBoxPaint(Sender: TObject);
begin
  PaintBox.Canvas.Draw(X, Y, SomeGraphic);
end;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-09
    • 2013-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多