MainFm.pas
上传用户:ctlcnc
上传日期:2021-12-10
资源大小:4933k
文件大小:7k
源码类别:

2D图形编程

开发平台:

Delphi

  1. unit MainFm;
  2. //---------------------------------------------------------------------------
  3. // Asphyre example application                          Modified: 21-Feb-2007
  4. // Copyright (c) 2000 - 2007  Afterwarp Interactive
  5. //---------------------------------------------------------------------------
  6. // This demo illustrates how to render isometric terrain with variable
  7. // height using Asphyre.
  8. //---------------------------------------------------------------------------
  9. // The contents of this file are subject to the Mozilla Public License
  10. // Version 1.1 (the "License"); you may not use this file except in
  11. // compliance with the License. You may obtain a copy of the License at
  12. // http://www.mozilla.org/MPL/
  13. //
  14. // Software distributed under the License is distributed on an "AS IS"
  15. // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
  16. // License for the specific language governing rights and limitations
  17. // under the License.
  18. //---------------------------------------------------------------------------
  19. interface
  20. //---------------------------------------------------------------------------
  21. uses
  22.   Windows, SysUtils, Classes, Controls, Forms, Dialogs, ComCtrls, AsphyreTypes,
  23.   AsphyreDevices, IsoLandscape;
  24. //---------------------------------------------------------------------------
  25. type
  26.   TMainForm = class(TForm)
  27.     StatusBar1: TStatusBar;
  28.     procedure FormResize(Sender: TObject);
  29.     procedure FormCreate(Sender: TObject);
  30.     procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  31.       Y: Integer);
  32.     procedure FormKeyPress(Sender: TObject; var Key: Char);
  33.     procedure FormDestroy(Sender: TObject);
  34.   private
  35.     { Private declarations }
  36.     WaterIndex: Integer;
  37.     procedure SetupDevice(Sender: TAsphyreDevice; Tag: TObject;
  38.      var Config: TScreenConfig);
  39.     procedure OnDeviceCreated(Sender: TObject; EventParam: Pointer;
  40.      var Success: Boolean);
  41.     procedure OnResolveFailed(Sender: TObject; EventParam: Pointer;
  42.      var Success: Boolean);
  43.     procedure TimerEvent(Sender: TObject);
  44.     procedure ProcessEvent(Sender: TObject);
  45.     procedure RenderPrimary(Sender: TAsphyreDevice; Tag: TObject);
  46.   public
  47.     { Public declarations }
  48.     Land: TLand;
  49.     MouseX, MouseY: Integer;
  50.   end;
  51. //---------------------------------------------------------------------------
  52. var
  53.   MainForm: TMainForm;
  54. //---------------------------------------------------------------------------
  55. implementation
  56. uses
  57.  MediaImages, MediaFonts, AsphyreTimer, AsphyreEffects, AsphyreEvents;
  58. {$R *.dfm}
  59. //---------------------------------------------------------------------------
  60. procedure TMainForm.FormCreate(Sender: TObject);
  61. begin
  62.  // retreive image and font descriptions
  63.  ImageGroups.ParseLink('/landscape.xml');
  64.  FontGroups.ParseLink('/landscape.xml');
  65.  if (not Devices.Initialize(SetupDevice, Self)) then
  66.   begin
  67.    MessageDlg('Failed to initialize Asphyre device.', mtError, [mbOk], 0);
  68.    Close();
  69.    Exit;
  70.   end;
  71.  // create instance of our isometric landscape
  72.  Land:= TLand.Create();
  73.  // configure Asphyre timer
  74.  Timer.Enabled  := True;
  75.  Timer.OnTimer  := TimerEvent;
  76.  Timer.OnProcess:= ProcessEvent;
  77.  Timer.MaxFPS   := 4000;
  78.  MouseX:= ClientWidth div 2;
  79.  MouseY:= ClientHeight div 2;
  80. end;
  81. //---------------------------------------------------------------------------
  82. procedure TMainForm.FormDestroy(Sender: TObject);
  83. begin
  84.  // finalize Asphyre device and remove all loaded images & fonts
  85.  Devices.Finalize();
  86.  // release landscape class
  87.  Land.Free();
  88. end;
  89. //---------------------------------------------------------------------------
  90. procedure TMainForm.SetupDevice(Sender: TAsphyreDevice; Tag: TObject;
  91.   var Config: TScreenConfig);
  92. begin
  93.  Config.Width   := ClientWidth;
  94.  Config.Height  := ClientHeight;
  95.  Config.Windowed:= True;
  96.  Config.WindowHandle:= Self.Handle;
  97.  Config.HardwareTL  := False;
  98.  // Subscribe to events related to this device.
  99.  EventDeviceCreate.Subscribe(OnDeviceCreated, Sender);
  100.  EventResolveFailed.Subscribe(OnResolveFailed, Sender);
  101. end;
  102. //---------------------------------------------------------------------------
  103. procedure TMainForm.OnDeviceCreated(Sender: TObject; EventParam: Pointer;
  104.  var Success: Boolean);
  105. begin
  106.  // Try to "resolve" the index for symbol "water". It is described
  107.  // in "images.xml" file and the actual location of graphics file
  108.  // is defined there.
  109.  //
  110.  // Since this symbol is static, we resolve it here (not in Reset event).
  111.  if (Sender is TAsphyreDevice) then
  112.   with Sender as TAsphyreDevice do
  113.    WaterIndex:= Images.ResolveImage('water');
  114. end;
  115. //---------------------------------------------------------------------------
  116. procedure TMainForm.OnResolveFailed(Sender: TObject; EventParam: Pointer;
  117.  var Success: Boolean);
  118. begin
  119.  MessageDlg('Failed to resolve symbol ' + PChar(EventParam), mtError, [mbOk],
  120.   0);
  121.  // make sure the application is terminated
  122.  Devices.Finalize();
  123.  Timer.Enabled:= False;
  124.  Application.Terminate();
  125. end;
  126. //---------------------------------------------------------------------------
  127. procedure TMainForm.FormResize(Sender: TObject);
  128. begin
  129.  Devices[0].ChangeParams(ClientWidth, ClientHeight, True);
  130. end;
  131. //---------------------------------------------------------------------------
  132. procedure TMainForm.TimerEvent(Sender: TObject);
  133. begin
  134.  Devices[0].Render(RenderPrimary, Self, $FF000050);
  135.  Timer.Process();
  136. end;
  137. //---------------------------------------------------------------------------
  138. procedure TMainForm.RenderPrimary(Sender: TAsphyreDevice; Tag: TObject);
  139. begin
  140.  Land.Render();
  141.  with Sender.Fonts.Font['x/squired'] do
  142.   begin
  143.    Options.Kerning:= -5;
  144.    TextOut('Frame Rate: ' + IntToStr(Timer.FrameRate), 4, 4, cColor2($FFFFD000,
  145.     $FFFFFFD0));
  146.    TextOut('Press ''G'' to switch wireframe grid.', 4, 28, cColor2($FFFFFFFF,
  147.     $FF00FF00));
  148.    TextOut('To scroll, move your mouse to edges.', 4, 52, cColor2($FFFF0000,
  149.     $FFFFE000));
  150.   end;
  151. end;
  152. //---------------------------------------------------------------------------
  153. procedure TMainForm.ProcessEvent(Sender: TObject);
  154. begin
  155.  if (MouseX < 64) then Land.XViewVel:= Land.XViewVel - 1;
  156.  if (MouseX > ClientWidth - 64) then Land.XViewVel:= Land.XViewVel + 1;
  157.  if (MouseY < 64) then Land.YViewVel:= Land.YViewVel - 1;
  158.  if (MouseY > ClientHeight - 64) then Land.YViewVel:= Land.YViewVel + 1;
  159.  Land.Process();
  160. end;
  161. //---------------------------------------------------------------------------
  162. procedure TMainForm.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  163.   Y: Integer);
  164. begin
  165.  MouseX:= X;
  166.  MouseY:= Y;
  167. end;
  168. //---------------------------------------------------------------------------
  169. procedure TMainForm.FormKeyPress(Sender: TObject; var Key: Char);
  170. begin
  171.  if (UpCase(Key) = 'G') then Land.Grid:= not Land.Grid;
  172. end;
  173. //---------------------------------------------------------------------------
  174. end.