unit UMinForm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
    FailureHandled: Boolean;
    GameTicks: Integer;

    procedure OnAsphyreCreate(Sender: TObject; Param: Pointer;
     var Handled: Boolean);

    procedure OnAsphyreDestroy(Sender: TObject; Param: Pointer;
     var Handled: Boolean);

    procedure OnDeviceInit(Sender: TObject; Param: Pointer;
     var Handled: Boolean);

    procedure OnDeviceCreate(Sender: TObject; Param: Pointer;
     var Handled: Boolean);

    procedure OnTimerReset(Sender: TObject; Param: Pointer;
     var Handled: Boolean);

    procedure TimerEvent(Sender: TObject);
    procedure ProcessEvent(Sender: TObject);
    procedure RenderEvent(Sender: TObject);

    procedure HandleConnectFailure();
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses
 Vectors2, Vectors2px, AsphyreTypes, AsphyreEventTypes, AsphyreEvents,
 AsphyreTimer, AsphyreFactory, AsphyreArchives, AbstractDevices, AsphyreImages,
 AsphyreFonts, AbstractCanvas, NativeConnectors, DX9Providers, GameTypes;

procedure TForm1.FormCreate(Sender: TObject);
begin
 {启用delphi的内存管理器显示内存泄漏信息}
 ReportMemoryLeaksOnShutdown:=DebugHook<>0 ;
 {使用DX9}
 Factory.UseProvider(idDirectX9);
 {创建 Asphyre 组件时,将调用此事件}
 EventAsphyreCreate.Subscribe(ClassName, OnAsphyreCreate);
 {指定Asphyre 组件销毁时候执行的事件}
 EventAsphyreDestroy.Subscribe(ClassName, OnAsphyreDestroy);
 {指定Asphyre 组件设备初始化其参数之前执行的事件}
 EventDeviceInit.Subscribe(ClassName, OnDeviceInit);
 {在 Asphyre 的设备创建后执行}
 EventDeviceCreate.Subscribe(ClassName, OnDeviceCreate);
 {重置计时器}
 EventTimerReset.Subscribe(ClassName, OnTimerReset);
 Timer.OnTimer  := TimerEvent;      //时钟的事件
 Timer.OnProcess:= ProcessEvent;    //时钟触发OnTimer事件的时候就触发这个事件
 Timer.Enabled  := True;
 Timer.MaxFPS:=100 ;
 {告诉 AsphyreManager 归档文件总是会在相同的文件夹中}
 ArchiveTypeAccess:= ataPackaged;
 {这个变量告诉一直到 Asphyre 设备连接失败已经处理了}
 FailureHandled:= False;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 // Disconnect Asphyre device.
 {// Disconnect Asphyre device.
Asphyre 设备断开。}
 if (Assigned(GameDevice)) then GameDevice.Disconnect();

 // Finish the Asphyre connection manager.
 {// Finish the Asphyre connection manager.
完成的 Asphyre 连接管理器。}
 NativeAsphyreConnect.Done();

 // Remove the subscription to the events.
 {// Remove the subscription to the events.
删除对事件的订阅。}
 EventProviders.Unsubscribe(ClassName);
end;

procedure TForm1.HandleConnectFailure;
begin
//
end;

procedure TForm1.OnAsphyreCreate(Sender: TObject; Param: Pointer;
  var Handled: Boolean);
begin
 // Create all Asphyre components.
 {// Create all Asphyre components.
创建 Asphyre 的所有组件。}
 GameDevice:= Factory.CreateDevice();
 GameCanvas:= Factory.CreateCanvas();
 GameImages:= TAsphyreImages.Create();
 GameFonts:= TAsphyreFonts.Create();
 GameFonts.Images:= GameImages;
 GameFonts.Canvas:= GameCanvas;

 MediaFile:= TAsphyreArchive.Create();
 MediaFile.OpenMode:= aomReadOnly;
 MediaFile.FileName:= 'media.asvf';
end;

procedure TForm1.OnAsphyreDestroy(Sender: TObject; Param: Pointer;
  var Handled: Boolean);
begin
 {释放所有组件}
 Timer.Enabled:= False;
 FreeAndNil(GameFonts);
 FreeAndNil(GameImages);
 FreeAndNil(MediaFile);
 FreeAndNil(GameCanvas);
 FreeAndNil(GameDevice);
end;

procedure TForm1.OnDeviceCreate(Sender: TObject; Param: Pointer;
  var Handled: Boolean);
begin
 {读取资源文件}
 GameImages.AddFromArchive('123.image', MediaFile, '', False);

 fontTahoma:= GameFonts.Insert('media.asvf | tahoma9b.xml', '123.image');
 imageLena := GameImages.AddFromArchive( 'lena.image', MediaFile);

 PBoolean(Param)^:=
  (PBoolean(Param)^)and
  (fontTahoma <> -1)and
  (imageLena <> -1);
end;

procedure TForm1.OnDeviceInit(Sender: TObject; Param: Pointer;
  var Handled: Boolean);
begin
 {设置画布的宽和长?}
 DisplaySize:= Point2px(ClientWidth, ClientHeight);
 GameDevice.SwapChains.Add(Self.Handle, DisplaySize);
end;

procedure TForm1.OnTimerReset(Sender: TObject; Param: Pointer;
  var Handled: Boolean);
begin
Timer.Reset();
end;

procedure TForm1.ProcessEvent(Sender: TObject);
begin
 Inc(GameTicks);
end;

procedure TForm1.RenderEvent(Sender: TObject);
var
 j, i: Integer;
 Omega, Kappa: Single;
begin
 {填充背景}
// for j:= 0 to DisplaySize.y div 40 do
//  for i:= 0 to DisplaySize.x div 40 do
//   GameCanvas.FillQuad(
//    pBounds4(i * 40, j * 40, 40, 40),
//    cColor4($FF585858, $FF505050, $FF484848, $FF404040));
//GameCanvas. UseImagePt(GameImages[imageLena]);

GameCanvas.UseImagePx(GameImages[imageLena], pBounds4(0, 0, 512, 512));{写入图像}
//GameCanvas.FillQuad(pBounds4(0, 0, 512, 512),cAlpha4(128));
GameCanvas.TexMap(pBounds4(0, 0, 512, 512),clWhite4);  {必须调用这个函数才可以显示到界面,和以前的版本不同,这个函数还可以实现动画
可能这样是更方便些吧}
// GameCanvas.TexMap(pRotate4c(
//  Point2(400.0, 300.0),
//  Point2(300.0, 300.0),
//  GameTicks * 0.01),
//  cAlpha4(128));


GameFonts[fontTahoma].TextOut(
  Point2(4.0, 4.0),
  'FPS: ' + IntToStr(Timer.FrameRate),
  cColor2($FFFFE887, $FFFF0000));
end;

procedure TForm1.TimerEvent(Sender: TObject);
begin
// Try to connect Asphyre to the application.
 {Try to connect Asphyre to the application.
尝试连接到应用程序中的 Asphyre。}
 if (not NativeAsphyreConnect.Init()) then Exit;

 // In case the device could not be initialized properly (in the frame before
 // this one), show error message and close the form.
 {// In case the device could not be initialized properly (in the frame before
在种情况下该设备无法初始化正确 (在之前的帧
// this one), show error message and close the form.
这一次),显示错误消息,并关闭该窗体。}
 if (Assigned(GameDevice))and(GameDevice.IsAtFault()) then
  begin
   if (not FailureHandled) then HandleConnectFailure();
   FailureHandled:= True;
   Exit;
  end;

 // Initialize Asphyre device, if needed. If this initialization fails, the
 // failure will be handled in the next OnTimer event.
 {// Initialize Asphyre device, if needed. If this initialization fails, the
初始化 Asphyre 的设备,如果需要的话。如果此初始化失败,
// failure will be handled in the next OnTimer event.
失败将会在下一个 OnTimer 事件处理。}
 if (not Assigned(GameDevice))or(not GameDevice.Connect()) then Exit;

 // Render the scene.
 {// Render the scene.
渲染场景。}
 {第一个参数执行的事件, 第二个参数是场景的颜色}
 GameDevice.Render(RenderEvent, $00000);
 // Execute constant time processing.
 {// Execute constant time processing.
执行时间是固定的加工。}
 Timer.Process();
end;

end.

 

posted on 2014-07-29 21:07  ★苍冥★  阅读(129)  评论(0编辑  收藏  举报