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

📄 diablo.dpr

📁 此為國外大名鼎鼎的2D遊戲引擎HGE的Delphi版本 原官方是C++的,現在完全改為Delphi可使用,另外再增加許多單元與功能 新增的單元有HGEImages,HGECanvas,HGEDef
💻 DPR
📖 第 1 页 / 共 2 页
字号:
      Monster[a, b].Shadow.Red := 0;
      Monster[a, b].Shadow.Green := 0;
      Monster[a, b].Shadow.Blue := 0;
      Monster[a, b].Shadow.Alpha := 80;
      Monster[a, b].Shadow.ImageName := Monster[a, b].ImageName;
      Monster[a, b].Shadow.AnimCount := Monster[a, b].FramePerDir;
      Monster[a, b].Shadow.AnimSpeed := 0.35;
      Monster[a, b].Shadow.AnimLooped := True;
      Monster[a, b].Shadow.DoAnimate := True;
      Monster[a, b].Shadow.Direction := Monster[a, b].Direction;
      Monster[a, b].Shadow.X1 := -(Monster[a, b].PatternWidth div 2) + Monster[a, b].X + 6;
      Monster[a, b].Shadow.Y1 := (Monster[a, b].PatternHeight div 2) + Monster[a, b].Y;
      Monster[a, b].Shadow.X2 := (Monster[a, b].PatternWidth div 2) + Monster[a, b].X + 6;
      Monster[a, b].Shadow.Y2 := (Monster[a, b].PatternHeight div 2) + Monster[a, b].Y;
      Monster[a, b].Shadow.X3 := Monster[a, b].PatternWidth + Monster[a, b].X + 6;
      Monster[a, b].Shadow.Y3 := Monster[a, b].PatternHeight + Monster[a, b].Y;
      Monster[a, b].Shadow.X4 := Monster[a, b].X + 6;
      Monster[a, b].Shadow.Y4 := Monster[a, b].PatternHeight + Monster[a, b].Y;
    end;
  end;
end;

procedure DrawMonsters;
var
  a, b: Integer;
begin
  for a := 0 to High(Monster) - 1 do
  begin
    for b := 0 to High(Monster[0]) - 1 do
    begin
      Monster[a, b].Shadow.DoDraw;
      Monster[a, b].Shadow.Move(1);
      Monster[a, b].DoDraw;
      Monster[a, b].Move(1);
      Monster[a, b].Shadow.Direction := Monster[a, b].Direction;
      Monster[a, b].Red := 65;
      Monster[a, b].Green := 65;
      Monster[a, b].Blue := 65;
      Monster[a, b].Light.DoDraw;
      Finger.Collision(Monster[a, b]);
    end;
  end;
end;
{
procedure THeroShadow.Draw;
begin
  PowerDraw.Device.DrawTransForm(PowerDraw.Images.Image[ImageName],
    PatternIndex,
    RoundNormal(X1 + OffsetX - Parent.WorldX), RoundNormal(Y1 + OffsetY - Parent.WorldY),
    RoundNormal(X2 + OffsetX - Parent.WorldX), RoundNormal(Y2 + OffsetY - Parent.WorldY),
    RoundNormal(X3 + OffsetX - Parent.WorldX), RoundNormal(Y3 + OffsetY - Parent.WorldY),
    RoundNormal(X4 + OffsetX - Parent.WorldX), RoundNormal(Y4 + OffsetY - Parent.WorldY),
    MirrorH, MirrorV,
    RGB1(Red, Green, Blue, Alpha), opSrcAlpha or opDiffuse);
end;
 }
procedure CreateHero;
begin
  Hero := THero.Create(SpriteEngine);
  Hero.ImageName := 'Player';
  Hero.Width:=Hero.PatternWidth;
  Hero.Height:=Hero.PatternHeight;
  Hero.X := 320;
  Hero.Y := 200;
  Hero.FramePerDir := 8;
  Hero.AnimSpeed := 0.30;
  Hero.DoAnimate := False;
  Hero.AnimLooped := True;
  Hero.AnimCount := 8;
  Hero.Red := 65;
  Hero.Green := 65;
  Hero.Blue := 65;
  Hero.Collisioned := True;
  Hero.CollideRadius := 20;
 //create hero's shadow
  Hero.Shadow := TShadowSprite.Create(SpriteEngine);
  Hero.Shadow.DrawMode := 3;
  Hero.Shadow.Red := 0;
  Hero.Shadow.Green := 0;
  Hero.Shadow.Blue := 0;
  Hero.Shadow.Alpha := 128;
  Hero.Shadow.ImageName := 'Player';
  Hero.Shadow.Width:=Hero.Shadow.PatternWidth;
  Hero.Shadow.Height:=Hero.Shadow.PatternHeight;
  Hero.Shadow.AnimCount := 8;
  Hero.Shadow.FramePerDir := 8;
  Hero.Shadow.AnimSpeed := 0.30;
  Hero.Shadow.AnimLooped := True;
  Hero.Shadow.DoAnimate := False;
end;

procedure DrawHero;
begin
  Hero.Shadow.DoDraw;
  Hero.Shadow.Move(1);
  Hero.DoDraw;
  Hero.Move(1);
  Hero.Shadow.X1 := -(Hero.PatternWidth div 2) + Hero.X - 6;
  Hero.Shadow.Y1 := (Hero.PatternHeight div 2) + Hero.Y;
  Hero.Shadow.X2 := (Hero.PatternWidth div 2) + Hero.X + 6;
  Hero.Shadow.Y2 := (Hero.PatternHeight div 2) + Hero.Y;
  Hero.Shadow.X3 := Hero.PatternWidth + Hero.X + 6;
  Hero.Shadow.Y3 := Hero.PatternHeight + Hero.Y;
  Hero.Shadow.X4 := Hero.X + 6;
  Hero.Shadow.Y4 := Hero.PatternHeight + Hero.Y;
  Hero.Shadow.Direction := Hero.Direction;
end;

function Angles(X, Y: Integer): Real;
begin
  Result := Abs(((Arctan2(X, Y) * 40.5)) - 128);
end;

procedure THero.DoMove(const MoveCount: Single);
var
  Directions: Integer;

begin
  inherited;

  Hero.CollidePos := point2(320 + Engine.WorldX + 70, 200 + Engine.WorldY + 70);
  Hero.X := Engine.WorldX + 320;
  Hero.Y := Engine.WorldY + 200;
  Directions := Round(Angles(trunc(MX) - 320, trunc(MY) - 200));

  case Directions of
    240..255,
      0..15:
      begin
        Direction := 0;
        Engine.WorldY := Engine.WorldY - Velocity1;
      end;
    16..47:
      begin
        Direction := 1;
        Engine.WorldX := Engine.WorldX + Velocity2;
        Engine.WorldY := Engine.WorldY - Velocity2;
      end;
    48..79:
      begin
        Direction := 2;
        Engine.WorldX := Engine.WorldX + Velocity1;
      end;
    80..111:
      begin
        Direction := 3;
        Engine.WorldX := Engine.WorldX + Velocity2;
        Engine.WorldY := Engine.WorldY + Velocity2;
      end;
    112..143:
      begin
        Direction := 4;
        Engine.WorldY := Engine.WorldY + Velocity1;
      end;
    144..175:
      begin
        Direction := 5;
        Engine.WorldX := Engine.WorldX - Velocity2;
        Engine.WorldY := Engine.WorldY + Velocity2;
      end;
    176..207:
      begin
        Direction := 6;
        Engine.WorldX := Engine.WorldX - Velocity1;
      end;
    208..239:
      begin
        Direction := 7;
        Engine.WorldX := Engine.WorldX - Velocity2;
        Engine.WorldY := Engine.WorldY - Velocity2;
      end;
  end;
  SetDirectionAnim;
end;

procedure THero.DoDraw;
begin
  inherited;
  Red := 65;
  Green := 65;
  Blue := 65;
  Finger.Collision(Hero);
end;

function FrameFunc: Boolean;
begin
  HGE.Input_GetMousePos(Mx,My);

  if HGE.Input_KeyDown(HGEK_LBUTTON) then
  begin
    Velocity1 := 2;
    Velocity2 := 1.5;
    Hero.DoAnimate := True;
    Hero.Shadow.DoAnimate := True;
  end;
  if HGE.Input_KeyUp(HGEK_LBUTTON) then
  begin
    Velocity1 := 0;
    Velocity2 := 0;
    Hero.DoAnimate := False;
    Hero.Shadow.DoAnimate := False;
  end;

  case HGE.Input_GetKey of
    HGEK_ESCAPE:
    begin
      FreeAndNil(Canvas);
      FreeAndNil(Images);
      FreeAndNil(SpriteEngine);
      FreeAndNil(Font);
      Result := True;
      Exit;
    end;
  end;
  Result := False;
end;

function RenderFunc: Boolean;
begin
  HGE.Gfx_BeginScene;
  HGE.Gfx_Clear(0);
  DrawTiles;
  DrawMonsters;
  DrawHero;
  Canvas.DrawEx(Images.Image['Light'],0,250,220,0,0,0.5,0.3,false,false,
               $FFFFFFFF,Blend_Light);
  Finger.Move(1);
  Canvas.Draw(Images.Image['panel1'],0,120, 555, Blend_Default);
  Canvas.Draw(Images.Image['panel3'],0, 0, 500, Blend_Default);
  Canvas.Draw(Images.Image['panel2'],0,690, 500, Blend_Default);
  Finger.DoDraw;
  Font.Print(100,100,IntToStr(HGE.Timer_GetFPS));
  Font.Print(300,500,'Mouse Down to Walk');
  HGE.Gfx_EndScene;
  Result := False;
end;

procedure Main;
begin
  HGE := HGECreate(HGE_VERSION);
  HGE.System_SetState(HGE_FRAMEFUNC,FrameFunc);
  HGE.System_SetState(HGE_RENDERFUNC,RenderFunc);
  HGE.System_SetState(HGE_USESOUND, False);
  HGE.System_SetState(HGE_WINDOWED,false);
  HGE.System_SetState(HGE_SCREENWIDTH, 800);
  HGE.System_SetState(HGE_SCREENHEIGHT,600);
  HGE.System_SetState(HGE_SCREENBPP,16);
  HGE.System_SetState(HGE_TEXTUREFILTER,False);
  HGE.System_SetState(HGE_FPS,HGEFPS_VSYNC);
  Canvas := THGeCanvas.Create;
  Images := THGEImages.Create;
  SpriteEngine := TSpriteEngine.Create(nil);
  Spriteengine.Images := Images;
  SpriteEngine.Canvas := Canvas;

  if (HGE.System_Initiate) then
  begin
    Font:=TSysFont.Create;
    Font.CreateFont('arial',12,[]);
    Images.LoadFromFile('Gfx\Dark Lord.png',54,79);
    Images.LoadFromFile('Gfx\Desert Wing.png',98,77);
    Images.LoadFromFile('Gfx\Enraged Fallen.png',54,64);
    Images.LoadFromFile('Gfx\Enraged Shaman.png',123,111);
    Images.LoadFromFile('Gfx\Night Clan.png',46,75);
    Images.LoadFromFile('Gfx\Mega Demon.png',171,153);
    Images.LoadFromFile('Gfx\Hell Buzzard.png',70,86);
    Images.LoadFromFile('Gfx\Player.png',83,108);
    Images.LoadFromFile('Gfx\Floor.png',160,80);
    Images.LoadFromFile('Gfx\Finger.png');
    Images.LoadFromFile('Gfx\Light.png');
    Images.LoadFromFile('Gfx\Panel1.png');
    Images.LoadFromFile('Gfx\Panel2.png');
    Images.LoadFromFile('Gfx\Panel3.png');
    CreateTiles(100, 100, -3000, -3000);
    CreateMonsters(30, 30);
    CreateHero;
    Finger := TFinger.Create(SpriteEngine);
    Finger.ImageName := 'finger';
    Finger.Width:=Finger.PatternWidth;
    Finger.Height:=Finger.PatternHeight;
    Finger.Collisioned := True;
    Finger.CollideRadius := 16;
    HGE.System_Start;
  end
  else
    MessageBox(0,PChar(HGE.System_GetErrorMessage),'Error',MB_OK or MB_ICONERROR or MB_SYSTEMMODAL);

  HGE.System_Shutdown;
  HGE := nil;
end;

begin
  ReportMemoryLeaksOnShutdown := True;
  Main;
end.

⌨️ 快捷键说明

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