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

📄 mir2.dpr

📁 很多人想要研究的真彩传奇2客户端,一般来说传奇2的客户端是256色的,现在出了个飞尔真彩传奇,想必很吸引大家的眼球.现在把我收藏的拿出来一起共享
💻 DPR
字号:
program Mir2;

{$R *.res}

uses
  SysUtils,
  Windows,
  DirectDraw,
  ClassCallback,
  GameClass,
  MirMap,
  MirWil,
  Globals,
  Actor,
  Assist,
  DebugUnit,
  DXFastBlt,
  ObjFastBlt;

type
  TGameEx = class(TGame)
  private
    FGraphicSurface: IDirectDrawSurface7;
    FDefaultFont: HFont;

    FStartTick: Cardinal; // 开始计数时间(用于 FPS)
    FFrameCount: Cardinal; // 已画表面次数(用于 FPS)
    FIsShowFPS: Boolean;

  protected
    function WMLButtonDown(hWnd: hWnd; uMsg: UINT; wParam: wParam; lParam: lParam): LRESULT; override;
    function WMLButtonUp(hWnd: hWnd; uMsg: UINT; wParam: wParam; lParam: lParam): LRESULT; override;
    function WMRButtonDown(hWnd: hWnd; uMsg: UINT; wParam: wParam; lParam: lParam): LRESULT; override;
    function WMRButtonUp(hWnd: hWnd; uMsg: UINT; wParam: wParam; lParam: lParam): LRESULT; override;
    function WMMouseMove(hWnd: hWnd; uMsg: UINT; wParam: wParam; lParam: lParam): LRESULT; override;

    function ProcessNextFrame: Boolean; override;
    function ReloadAllSurfaceImages: Boolean; override;
    procedure CreateFonts;

  public
    IsLButtonDown: Boolean;
    IsRButtonDown: Boolean;
    IsShiftKeyDown: Boolean;

    Map: TMirMap;
    NewActor: THumanActor;
    MySelf: THumanActor;

    WalkLength: Integer;

    MapX, MapY: Word;

    constructor Create(ACaption: string; AFullScreen: Boolean;
      AWidth, AHeight: Integer; ABackgroundColor: TColorRef); override;
    destructor Destroy; override;

  end;

var
  Game: TGameEx;


{ TGameEx }

constructor TGameEx.Create(ACaption: string; AFullScreen: Boolean;
  AWidth, AHeight: Integer; ABackgroundColor: TColorRef);
var
  I: Integer;
  DC: HDC;
begin
  inherited Create(ACaption, AFullScreen, AWidth, AHeight, ABackgroundColor);

  CreateFonts;

  FIsShowFPS := True;

  Map := TMirMap.Create(MAPSURFACE_WIDTH, MAPSURFACE_HEIGHT);
  Map.FileName := G_MirMapPath + '地图.map';


  NewActor := THumanActor.Create(Map);
  NewActor.Appearance := 0;
  NewActor.Weapon := 1;
  NewActor.Sex := 1;
  NewActor.Hair := 0;
  NewActor.Job := 1;
  NewActor.Direction := Random(100) mod 8;
  NewActor.CurrentAction := HUMANACTION_WALK;

  NewActor.ReCalcFrames;

  MySelf := THumanActor.Create(Map);
  MySelf.Job := 0;
  MySelf.ReCalcFrames;

  // 背景图片
 // G_WilTile       := TWilFile.Create(G_MirWilPath + 'Tiles',    MainDirectDraw);
 // G_WilTileSm     := TWilFile.Create(G_MirWilPath + 'SmTiles',  MainDirectDraw);
  // 前景图片
 // G_WilObjects[0] := TWilFile.Create(G_MirWilPath + 'Objects',  MainDirectDraw);
  ShuJi := TWilFile.Create(G_MirWilPath + '数据');
 // G_WilObjects[2] := TWilFile.Create(G_MirWilPath + 'Objects3', MainDirectDraw);
 // G_WilObjects[3] := TWilFile.Create(G_MirWilPath + 'Objects4', MainDirectDraw);
 // G_WilObjects[4] := TWilFile.Create(G_MirWilPath + 'Objects5', MainDirectDraw);
 // G_WilObjects[5] := TWilFile.Create(G_MirWilPath + 'Objects6', MainDirectDraw);
 // G_WilObjects[6] := TWilFile.Create(G_MirWilPath + 'Objects7', MainDirectDraw);
  // 人类角色图片
  //G_WilHuman      := TWilFile.Create(G_MirWilPath + '身体',      MainDirectDraw);
  //G_WilHair       := TWilFile.Create(G_MirWilPath + '头发',     MainDirectDraw);
  //G_WilWeapon     := TWilFile.Create(G_MirWilPath + '武器',   MainDirectDraw);
  //G_WilMagic      := TWilFile.Create(G_MirWilPath + '刺杀',    MainDirectDraw);
  // 游戏界面图片
  //G_WilPrgUse     := TWilFile.Create(G_MirWilPath + '界面',   MainDirectDraw);

  // TODO:
  {
  // 生成调色板数据
  DC := GetDC(0);
  GetSystemPaletteEntries(DC, 0, 256, PaletteEntries);
  ReleaseDC(0, DC);

  for I := 10 to 245 do
    RGBQuadToPaletteEntry(ShuJi.MainColorTable^[I], PaletteEntries[I]);

  for I := 0 to 255 do
    PaletteEntries[I].peFlags := $40;

  // 设置调色板
  if MainDirectDraw.CreatePalette(DDPCAPS_8BIT, @PaletteEntries, Palette, nil) <> DD_OK then
    raise exception.Create('CreatePalette error!');
  PrimarySurface.SetPalette(Palette);

  //
  if not LoadNearestIndex(NEARESTPALETTEINDEX_FILE) then
  begin
    BuildNearestIndex(ShuJi.MainColorTable^);
    SaveNearestIndex(NEARESTPALETTEINDEX_FILE);
  end;
  }
  ReloadAllSurfaceImages;

//  MapX := 20; MapY := 16;

end;

destructor TGameEx.Destroy;
begin
  // 清除地图
  FreeAndNil(Map);

  // 清除玩家角色
  FreeAndNil(MySelf);

  // 背景图片
 // FreeAndNil(G_WilTile);
 // FreeAndNil(G_WilTileSm);
  // 前景图片
 // FreeAndNil(G_WilObjects[0]);
  FreeAndNil(ShuJi);
 // FreeAndNil(G_WilObjects[2]);
//  FreeAndNil(G_WilObjects[3]);
 // FreeAndNil(G_WilObjects[4]);
//  FreeAndNil(G_WilObjects[5]);
 // FreeAndNil(G_WilObjects[6]);
  // 人类角色图片
  //FreeAndNil(G_WilHuman);
 // FreeAndNil(G_WilHair);
  //FreeAndNil(G_WilWeapon);
  //FreeAndNil(G_WilMagic);
  // 游戏界面图片
  //FreeAndNil(G_WilPrgUse);

  inherited Destroy;
end;

procedure TGameEx.CreateFonts;
var
  lf: TLogFont;
  DC: HDC;
begin
  DC := GetDC(0);

  FillChar(lf, SizeOf(lf), #0);
  // TODO: MulDiv
  lf.lfHeight := -MulDiv(9, GetDeviceCaps(DC, LOGPIXELSY), 72);
  lf.lfWidth := 0;
  lf.lfCharSet := DEFAULT_CHARSET;
  lf.lfFaceName := '宋体';

  FDefaultFont := CreateFontIndirect(lf);
end;

function TGameEx.ReloadAllSurfaceImages: Boolean;
begin
 // FGraphicSurface := nil;
 // FGraphicSurface := ShuJi.Surfaces[5680];

  Result := True;
end;

function TGameEx.ProcessNextFrame: Boolean;
var
  S: string;
  Pt: TPoint;
  I: Integer;
  TickCount: Cardinal;
  FPS: Integer;
  DXFastBlt: TDxFastBlt;
begin
  Result := True;

  // 场景动画
  if GetTickCount - Map.AniTick > 50 then
  begin
    Map.AniTick := GetTickCount;
    Inc(Map.AniCount);
    if Map.AniCount > 100000 then
      Map.AniCount := 0;
  end;

  if not ClearBufferSurface then Exit;

  if IsLButtonDown or IsRButtonDown or IsShiftKeyDown then
  begin
    GetCursorPos(Pt);
    ScreenToClient(Self.MainWindow, Pt);
    if Pt.X > MAPSURFACE_WIDTH div 2 then
      Pt.X := Pt.X + MAPUNIT_WIDTH div 2 else
      Pt.X := Pt.X - MAPUNIT_WIDTH div 2;
    if Pt.Y > MAPSURFACE_HEIGHT div 2 then
      Pt.Y := Pt.Y + MAPUNIT_HEIGHT div 2 else
      Pt.Y := Pt.Y - MAPUNIT_HEIGHT div 2;

    Pt.X := MySelf.MapX + (Pt.X - MAPSURFACE_WIDTH div 2) div MAPUNIT_WIDTH;
    Pt.Y := MySelf.MapY + (Pt.Y - MAPSURFACE_HEIGHT div 2) div MAPUNIT_HEIGHT;

    if IsShiftKeyDown then MySelf.Hit(Pt.X, Pt.Y) else
      if IsLButtonDown then MySelf.Walk(Pt.X, Pt.Y) else
      if IsRButtonDown then MySelf.Run(Pt.X, Pt.Y);
  end;


  NewActor.Run(MySelf.MapX - 2, MySelf.MapY);
  NewActor.Hit(MySelf.MapX, MySelf.MapY);


  NewActor.ProcessFrame;

  MySelf.ProcessFrame;

  //Map.DrawBackground(BufferSurface, MySelf.MapX, MySelf.MapY, MySelf.ShiftX, MySelf.ShiftY);

//  BrightEffect(BufferSurface, 100, 100);

  Map.DrawForeground(BackDxFastBlt, MySelf.MapX, MySelf.MapY, MySelf.ShiftX, MySelf.ShiftY, True);
  Map.DrawForeground(BackDxFastBlt, MySelf.MapX, MySelf.MapY, MySelf.ShiftX, MySelf.ShiftY, False);
  MySelf.Draw(BackDxFastBlt, MAPCENTER_X, MAPCENTER_Y, MAPSURFACE_WIDTH, MAPSURFACE_HEIGHT);

  NewActor.Draw(BackDxFastBlt,
    MAPCENTER_X + (NewActor.MapX - MySelf.MapX) * MAPUNIT_WIDTH + NewActor.ShiftX - MySelf.ShiftX,
    MAPCENTER_Y + (NewActor.MapY - MySelf.MapY) * MAPUNIT_HEIGHT + NewActor.ShiftY - MySelf.ShiftY,
    MAPSURFACE_WIDTH, MAPSURFACE_HEIGHT); 


  DXFastBlt := ShuJi.Surfaces[5680];
  if DXFastBlt <> nil then
    BackDxFastBlt.DrawC(DXFastBlt, 0, 349, 1.0);

  // 显示 FPS
  {if FIsShowFPS then
  begin
    TickCount := GetTickCount - FStartTick;
    if TickCount < 1000 then
    begin
      Inc(FFrameCount);
      if TickCount > 0 then
      begin
        FPS := FFrameCount * 1000 div TickCount;
        S := Format('FPS: %d', [FPS]);
        DrawSurfaceText(BufferSurface, S, 10, 10, FDefaultFont, RGB(255, 0, 0));
//        if FPS > 100 then Sleep(1);
      end;
    end
    else begin
      FFrameCount := 0;
      FStartTick := GetTickCount;
    end;
  end;

  // 画地图大小
  S := Format('对手位置 : (%d,%d)', [NewActor.MapX, NewActor.MapY]);
  DrawSurfaceText(BufferSurface, S, 10, 420, FDefaultFont, RGB(255, 255, 255));  }
end;

function TGameEx.WMMouseMove(hWnd: hWnd; uMsg: UINT; wParam: wParam; lParam: lParam): LRESULT;
begin

  Result := 0;

end;

function TGameEx.WMLButtonDown(hWnd: hWnd; uMsg: UINT; wParam: wParam; lParam: lParam): LRESULT;
begin
  IsLButtonDown := True;
  if wParam and MK_SHIFT > 0 then IsShiftKeyDown := True;
  Result := 0;
end;

function TGameEx.WMLButtonUp(hWnd: hWnd; uMsg: UINT; wParam: wParam; lParam: lParam): LRESULT;
begin
  IsLButtonDown := False;
  IsShiftKeyDown := False;
  Result := 0;
end;

function TGameEx.WMRButtonDown(hWnd: hWnd; uMsg: UINT; wParam: wParam; lParam: lParam): LRESULT;
begin
//  Inc(MySelf.MapX, 10);
//  Inc(MySelf.MapY, 10);
  IsRButtonDown := True;

  Result := 0;
end;

function TGameEx.WMRButtonUp(hWnd: hWnd; uMsg: UINT; wParam: wParam; lParam: lParam): LRESULT;
begin
  IsRButtonDown := False;
  Result := 0;
end;


begin

  Game := TGameEx.Create('Hello, Game Application!',
    False, CLIENT_WIDTH, CLIENT_HEIGHT, RGB(0, 0, 0));

  Game.Run;

end.

⌨️ 快捷键说明

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