⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clmain.pas

📁 一个delphi写的游戏引擎
💻 PAS
字号:
unit clMain;
//mir2 gui:今天才发现mir2的源码结构实在太糟糕,类的封装太烦琐,但是为了研究学习,本工程还是保留了源程序中的
//封装逻辑:即  clmain->IntroScn->Drawscrn
interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DWinCtl, WIL, ExtCtrls, DXDraws, DXClass, IntroScn,Drawscrn,
  StdCtrls;
const
  SCREENWIDTH=800;
  SCREENHEIGHT=600;
type
    TFrmMain = class(TDxForm)
    DXDraw1: TDXDraw;
    DWinMan: TDWinManager;
    WProgUse: TWMImages;
    Timer1: TTimer;

    procedure FormCreate(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure FormKeyPress(Sender: TObject; var Key: Char);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormDestroy(Sender: TObject);

    //下面这二个实际上是自定义的,但放在了窗体文件中相当于内定的函数
    procedure DXDraw1Initialize(Sender: TObject);
    procedure DXDraw1Finalize(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);


  private
    { Private declarations }


  public
  topleft:string;
    { Public declarations }

  procedure AppOnIdle (Sender: TObject; var Done: Boolean);
  end;

var
  ToolMenuHook: HHOOK;
  LastHookKey: integer;
  LastHookKeyTime: longword;
  FrmMain: TFrmMain;
  DScreen: TDrawScreen;
  IntroScene: TIntroScene;
  LoginScene: TLoginScene;


implementation

uses FState;

{$R *.dfm}

function KeyboardHookProc (Code: Integer; WParam: Longint; var Msg: TMsg): Longint; stdcall;
begin
   if ((WParam = 9){ or (WParam = 13)}) and (LastHookKey = 18) and (GetTickCount - LastHookKeyTime < 500) then begin
      if FrmMain.WindowState <> wsMinimized then begin
         FrmMain.WindowState := wsMinimized;
      end else
         Result := CallNextHookEx(ToolMenuHook, Code, WParam, Longint(@Msg));
      exit;
   end;
   LastHookKey := WParam;
   LastHookKeyTime := GetTickCount;

   Result := CallNextHookEx(ToolMenuHook, Code, WParam, Longint(@Msg));
end;

procedure TFrmMain.FormCreate(Sender: TObject);
begin
Timer1.Enabled:=false;
MainWinHandle := DxDraw1.Handle;
Application.OnIdle := AppOnIdle;

  ToolMenuHook := SetWindowsHookEx(WH_KEYBOARD, @KeyboardHookProc, 0, GetCurrentThreadID);
DScreen := TDrawScreen.Create;
IntroScene := TIntroScene.Create;
//知道为什么这个程序只有登录窗口而没有门吗,,开门其实是introscene的作用,,
//introscn单元里定义的只是一个虚基类的introscene,,因此没有任何的作为
LoginScene := TLoginScene.Create;

end;

procedure TFrmMain.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);

begin
  {如果按了Esc,则退出}
  if Key=VK_ESCAPE then
    Timer1.Enabled:=true;

{全屏模式和窗口模式的切换}
  if (ssAlt in Shift) and (Key=VK_RETURN) then
  begin
    DXDraw1.Finalize;

    if doFullScreen in DXDraw1.Options then
    begin
      RestoreWindow;

      BorderStyle := bsSizeable;
      DXDraw1.Options := DXDraw1.Options - [doFullScreen];
    end else
    begin
      StoreWindow;

      DXDraw1.Cursor := crNone;
      BorderStyle := bsNone;
      DXDraw1.Options := DXDraw1.Options + [doFullScreen];
    end;

    DXDraw1.Initialize;
  end;

  end;

procedure TFrmMain.FormKeyPress(Sender: TObject; var Key: Char);
begin
//sdf
end;

procedure TFrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
//action 可以删除以减化逻辑?
begin
//oii

end;

procedure TFrmMain.FormDestroy(Sender: TObject);
begin
if ToolMenuHook <> 0 then UnhookWindowsHookEx(ToolMenuHook);
WProgUse.Finalize;
IntroScene.Free;
LoginScene.Free;
DScreen.Finalize;
DScreen.Free;
end;

procedure TFrmMain.DXDraw1Initialize(Sender: TObject);
begin
  DxDraw1.SurfaceWidth := 800;
  DxDraw1.SurfaceHeight := 600;
  WProgUse.DDraw := DxDraw1.DDraw; //属性窗口中可设置
  WProgUse.Initialize;
  DXDraw1.DefColorTable := WProgUse.MainPalette;
  DXDraw1.ColorTable := DXDraw1.DefColorTable;
      DXDraw1.UpdatePalette;
      FrmDlg.Initialize; //这个过程可复杂了
      DScreen.Initialize;
      
 //     if doFullScreen in DxDraw1.Options then begin
//    UseDIBSurface : = TRUE;   //这个对程序有作用?
end;

{--------------------- Mouse Interface ----------------------}



procedure TFrmMain.DXDraw1Finalize(Sender: TObject);
begin
   //DXTimer.Enabled := FALSE;
end;



procedure TFrmMain.AppOnIdle (Sender: TObject; var Done: Boolean);

begin
   Done := TRUE;
   if not DXDraw1.CanDraw then exit;


  //  ProcessKeyMessages;
   DScreen.DrawScreen (DxDraw1.Surface);
   DWinMan.DirectPaint (DxDraw1.Surface);
   

   with DXDraw1.Surface.Canvas do
    begin
    topleft:='按下ESC模拟网络连接,,,2秒钟之后连接成功...';
    textout(10,10,topleft);
    Release;
    end;
    dxdraw1.Flip;

 // DxDraw1.Primary.Draw (0, 0, DxDraw1.Surface.ClientRect, DxDraw1.Surface, FALSE);
end;


procedure TFrmMain.Timer1Timer(Sender: TObject);
begin
//LoginScene.ChangeLoginState(lsLogin);
//DScreen.ChangeScene (stIntro);
DScreen.ChangeScene (stlogin);
Timer1.Enabled:=false;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -