1

我一直在做一个修复旧游戏的项目,最终产生了新的想法,添加了一些关于游戏世界的很酷的额外信息,并实时跟踪游戏本身对用户隐藏的一些重要信息(没有实际的原因)并遇到了这个问题:

当我尝试在游戏上绘制以显示我想要的信息时,游戏会更新自己的窗口并进行绘制。

我的第一种方法是使用带有 HWND_TOPMOST 的窗口位于游戏窗口的顶部,但它没有按预期工作,窗口只是不会越过游戏窗口并且不会显示信息。

第二种方法是使用 GDI 函数,例如 TextOut,文本在那里,但会闪烁很多,并且强制它在很短的时间内绘制会占用太多内存。

我想要一些关于如何在不实际挂钩 DX 功能或类似的东西的情况下做到这一点的想法(因为我对 DX 知之甚少)。有什么方法可以在这个窗口上实际绘制以显示信息而不闪烁?

4

1 回答 1

0

您可以使用 unDelphiX 来获取执行 DirectX 的 Delphi 包。
你可以在这里下载包:http: //www.micrel.cz/Dx/

它完全是最新的,使 DirectX 几乎像标准 GDI 一样工作。

无闪烁绘图
消除闪烁的技巧是绘制到屏幕外表面,并在完成后“翻转”屏幕外表面。
翻转可以与 VerticalSync 同步,因此也没有撕裂。

演示
有一个演示,以毫秒为单位显示当前时间,没有任何闪烁。

unit Main;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls, Menus, DXClass, DXDraws;

type
  TMainForm = class(TDXForm)
    DXDraw: TDXDraw;
    DXTimer: TDXTimer;  //Precision timer. 
    procedure DXDrawFinalize(Sender: TObject);
    procedure DXDrawInitialize(Sender: TObject);
    procedure DXTimerTimer(Sender: TObject; LagCount: Integer);
  end;

var
  MainForm: TMainForm;

implementation

uses MMSystem;

{$R *.DFM}

procedure TMainForm.DXDrawInitialize(Sender: TObject);
begin
  DXTimer.Enabled := True;
end;

procedure TMainForm.DXDrawFinalize(Sender: TObject);
begin
  DXTimer.Enabled := False;
end;

procedure TMainForm.DXTimerTimer(Sender: TObject; LagCount: Integer);
var
  formattedDateTime: string;
begin
  if not DXDraw.CanDraw then exit;

  DXDraw.Surface.Fill(0);

  with DXDraw.Surface.Canvas do  //Draw to offscreen surface.
  begin
    Brush.Style := bsClear;
    Font.Color := clWhite;
    Font.Size := 30;
    DateTimeToString(formattedDateTime, 'hh:nn:ss.zzz', Now);
    Textout(30, 30, formattedDateTime);

    Release; {  Indispensability  }
  end;

  DXDraw.Flip;  //Flip the offscreen surface to screen, no flicker :=)
end;

end.

在 XE2 中安装 unDelphiX
为了在 Delphi XE2 中安装软件包,我必须添加DesignIDErequiresdpk 的子句中。像这样:

在此处输入图像描述

这将修复DesignIntf.dcu未找到的错误。

显示全屏
如果你想做全屏,你可以在 DXDraw 的设置中启用它,但是注意:

在此处输入图像描述

如果您在doFullScreen未启用的情况下启用doSelectDriver,则会出现interface not supported错误。启用它们,一切都会好起来的。
见: http: //www.micrel.cz/Dx/history.rtf ‎</p>

不要忘记听按键并退出应用程序ESC或其他东西,否则您将陷入全屏模式。

于 2013-10-08T22:22:18.550 回答