设为首页 加入收藏

TOP

【Asphyre引擎】学习笔记(二)(三)
2017-10-10 12:06:57 】 浏览:5509
Tags:Asphyre 引擎 学习 笔记
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    := 60.0;

 

计时器的速度,或者叫响应间隔也行,取决于你将来的理解,以后会慢慢理解的,别着急。

Timer.MaxFPS   := 4000;

 

最大刷新,当真正执行一个大绘画时,基本达不到。

Timer.Enabled  := True;

 

当这一句执行的时候,计时器将正式启动。

如果你不设置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过程后面的

首页 上一页 1 2 3 4 下一页 尾页 3/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇【Asphyre引擎】学习笔记(一) 下一篇Delphi 10 Seattle Update 1 修复..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目