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.