eate调用我们的过程。
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
procedure OnDeviceCreate(Sender: TObject; Param: Pointer; var Handled: Boolean);
从上面我们可以看到我们声明的过程是这个样子:
procedure OnDeviceCreate(Sender: TObject; Param: Pointer; var Handled: Boolean);
你可能会想到,为什么,一定要是这种参数方式,我们是不是可以换一种参数方式?在EventProviders单元的22行,Asphyre定义了这个过程的形参方式,如果你需要换一种方式,就要对Asphyre本身进行修改,如果你现在还没有那个能力,那么还是老老实实的跟着我断续学习。
单元 EventProviders.pas 第22行;
TEventCallback = procedure(Sender: TObject; Param: Pointer; var Handled: Boolean) of object;
由于我们的第一个目标是在屏幕上画一个点,所以我们不需要装载任何资料,所以我们的过程实现,看起来是下面这个样子。
procedure TForm1.OnDeviceCreate(Sender: TObject; Param: Pointer; var Handled: Boolean);
var
Success: Boolean;
begin
Success:= PBoolean(Param)^;
PBoolean(Param)^:= Success;
end;
我们把Param原原本本的再传回去,不做修改,如果我们有资源在这里装载失败的话,修改Param指向的地址。在我们第一目标中,我们不需要它。
回到 Form1.Create 过程 我们要在EventDeviceCreate.Subscribe(OnDeviceCreate, 0);下面正式初始化TAsphyreDevice
if (not GameDevice.Initialize()) then
begin
ShowMessage('Failed to initialize Asphyre device.');
Application.Terminate();
Exit;
end;
细节先不要去思考,你先把它当成固定格式,以后我们会讨论,当然是在深入以后,才会讨论TAsphyreDevice的细节。
接下来是建立我们的计时器:
Timer.OnTimer := TimerEvent;
Timer.OnProcess:= ProcessEvent;
Timer.Speed := 60.0;
Timer.MaxFPS := 4000;
Timer.Enabled := True;
Timer的声明是在AsphyreTimer单元里,所以我们要引入AsphyreTimer单元。引入后是下面这个样子:
implementation
uses
Vectors2px, AsphyreFactory, DX7Providers, AsphyreTimer;
我们先简单的看一下计时器的设置。
Timer.OnTimer := TimerEvent;
我们要在TimerEvent事件过程里执行我们的绘画代码。后面我们要定义TimerEvent过程和实现这个过程。
Timer.OnProcess:= ProcessEvent;
我们要在ProcessEvent事件过程里放一个记数器。在我们第一目标中,这个记数器没什么作用。在以后的以后,我们会用到它。
计时器的速度,或者叫响应间隔也行,取决于你将来的理解,以后会慢慢理解的,别着急。
最大刷新,当真正执行一个大绘画时,基本达不到。
当这一句执行的时候,计时器将正式启动。
如果你不设置Timer.Speed,MaxFPS,那么它们的默认值将是:
Speed := 60.0;
MaxFPS:= 100;
接下来我们要做的工作是 Timer.OnTimer := TimerEvent;我们要声明一个TimerEvent事件供计时器调用的时候使用。
private
{ Private declarations }
GameTicks: Integer;
procedure OnDeviceCreate(Sender: TObject; Param: Pointer; var Handled: Boolean);
procedure TimerEvent(Sender: TObject);
看起来是上面这个样子,你需要在private里声明TimerEvent。然后在过程后面的分号处按键盘上的 Ctrl + Shift +C 转到过程的实现部分。
procedure TForm1.TimerEvent(Sender: TObject);
begin
GameDevice.Render(RenderEvent, $000000);
Timer.Process();
end;
说明:
GameDevice.Render(绘画事件过程,背影色);
RenderEvent 我们要绘画的事件。
$000000 为黑色。
Timer.Process(); 调用 Timer.OnProcess:= ProcessEvent; 我们需要定义一个ProcessEvent事件过程,在里面实现一个简单的计数器,虽然在我们第一目标里没什么用,但以后的以后总会用到。
所以现在要声明ProcessEvent事件,声明看起来和下面差不多:
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
GameTicks: Integer;
procedure OnDeviceCreate(Sender: TObject; Param: Pointer; var Handled: Boolean);
procedure TimerEvent(Sender: TObject);
procedure ProcessEvent(Sender: TObject);
上面最后一行就是我们对ProcessEvent的声明,你别忘了,顺手在{ Private declarations }下面,将GameTicks: Integer;写上,这个变量就是一个简单的记数器了。
在ProcessEvent过程后面的