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

📄 doudou.dpr.~1~

📁 此為國外大名鼎鼎的2D遊戲引擎HGE的Delphi版本 原官方是C++的,現在完全改為Delphi可使用,另外再增加許多單元與功能 新增的單元有HGEImages,HGECanvas,HGEDef
💻 ~1~
📖 第 1 页 / 共 2 页
字号:
     begin
          Layer1pos:=Engine.Worldx*1*0.5-20000;
          Layer2pos:=Engine.Worldx*1*0.25-20000;
     end;
     Collision;
end;

procedure TActor.DoCollision(const Sprite: TSprite);
var
   TileName: string;
   TileLeft, TileRight,
   TileTop, TileBottom: Integer;
begin
     if (Sprite is TTile) then
     begin
          TileName := TTile(Sprite).ImageName;
          //only those tile can collision
          if (TileName='Ground1') or (TileName ='Rock2') or (TileName = 'Rock1') or (TileName='Box1') or (TileName='Box2') or(TileName='Box3') or (TileName='Box4') or (TileName='Spring1') then
          begin
               TileLeft := Trunc(TTile(Sprite).X);
               TileTop := Trunc(TTile(Sprite).Y);
               TileRight := Trunc(TTile(Sprite).X) + TTile(Sprite).PatternWidth;
               TileBottom := Trunc(TTile(Sprite).Y) + TTile(Sprite).PatternHeight;
               LeftEdge := Trunc(TTile(Sprite).X);
               RightEdge := Trunc(TTile(Sprite).X) + TTile(Sprite).PatternWidth;
          end;
          //Falling-- land at ground
          if JumpState = jsFalling then
          begin
               if  (TileName = 'Ground1') or (TileName = 'Rock2')or (TileName = 'Rock1') or (TileName='Box1') or (TileName='Box2') or(TileName='Box3') or (TileName='Box4') then
               begin
                    if(Self.Right - 4 > TileLeft) and
                    (Self.Left + 3 < TileRight)   and
                    (Self.Bottom - 12 < TileTop)   then
                    begin
                         JumpState := jsNone;
                         case UserRefreshRate of
                              60:
                              begin
                                    JumpSpeed := 0.49;
                                    JumpHeight := 13.3;
                                    MaxFallSpeed := 9;
                              end;
                              75:
                              begin
                                    JumpSpeed := 0.3;
                                    JumpHeight := 10.5;
                                    MaxFallSpeed := 9;
                              end;
                              85:
                              begin
                                    JumpSpeed := 0.2;
                                    JumpHeight := 8.5;
                                    MaxFallSpeed := 8;
                              end;
                              100:
                              begin
                                    JumpSpeed := 0.13;
                                    JumpHeight := 6.9;
                                    MaxFallSpeed := 8;
                              end;
                              120:
                              begin
                                   JumpSpeed := 0.1;
                                   JumpHeight := 5;
                                   MaxFallSpeed := 8;
                              end;
                          end;
                         Self.Y := TileTop - 102;

                         case State of
                             StandLeft: SetAnim('Idle', 0, 12, 0.25, True, True, True);
                             StandRight:SetAnim('Idle', 0, 12, 0.25, True, False, True);
                             WalkLeft:  SetAnim('walk', 0, 12, 0.2, True, True, True);
                             WalkRight: SetAnim('walk', 0, 12, 0.2, True, False, True);
                         end;
                    end;
               end;
          end;
          // jumping-- touch top tiles
          if JumpState = jsJumping then
          begin
               if (TileName = 'Rock2')or (TileName = 'Rock1') or (TileName='Box1') or (TileName='Box2') or(TileName='Box3') or (TileName='Box4')then
               begin
                    if (Self.Right - 4 > TileLeft)  and
                       (Self.Left + 3  < TileRight) and
                       (Self.Top < TileBottom - 5)   and
                       (Self.Bottom >TileTop + 8)    then
                    begin
                         Jumpstate:= jsfalling;
                         if  (TileName='Box1') or (TileName='Box2') or(TileName='Box3') or (TileName='Box4') then
                         begin
                            //   MainForm.Music.Songs.Items[2].Play;
                              TTile(Sprite).Dead;
                              SprayBox(TTile(Sprite).X, TTile(Sprite).Y);
                              CreateGreenApple(TTile(Sprite).X, TTile(Sprite).Y);
                         end;
                    end;
               end;
          end;

          //tiles collision
          if (TileName = 'Rock2')or (TileName = 'Rock1') or (TileName='Box1') or (TileName='Box2') or(TileName='Box3') or (TileName='Box4') or (TileName='Spring1')then
          begin
               if State=WalkLeft then
               begin
                     if (Self.Left + 8 > TileRight) and
                        (Self.Top + 10 < TileBottom)   and
                        (Self.Bottom - 8 >TileTop)     then
                           Self.X := TTile(Sprite).X + (TTile(sprite).PatternWidth-45)-3;
               end;

               if State=WalkRight then
               begin
                    if (Self.Right - 8  < TileLeft) and
                       (Self.Top + 10 < TileBottom)  and
                       (Self.Bottom - 8 > TileTop)    then
                          Self.X := TTile(Sprite).X - (Self.PatternWidth-45)+3; // 64= self right
               end;
          end;
          //get  fruit
          if (TileName='Fruit1') or (TileName='Fruit4')   then
          begin
                  Inc(FruitCount);
                  //  MainForm.Music.Songs.Find('GetFruit').Play;
                  TTile(Sprite).Dead;
                  SprayFruit(TTile(Sprite).X + 10, TTile(Sprite).Y + 10);
          end;

          //
          if (TileName = 'Spring1') and (JumpState = jsFalling)  then
          begin
              // MainForm.Music.Songs.Find('Rebon').Play;
               Self.Y:=TileTop-85;
               JumpState:=jsNone;
               DoJump:=True;
               if UserRefreshRate=60 then
               begin
                    JumpSpeed := 0.5;
                    JumpHeight := 20.5;
                    MaxFallSpeed := 12;
               end;
               if UserRefreshRate=75 then
               begin
                    JumpSpeed := 0.25;
                    JumpHeight := 14.5;
                    MaxFallSpeed := 10;
               end;
               if UserRefreshRate=85 then
               begin
                    JumpSpeed := 0.2;
                    JumpHeight := 13;
                    MaxFallSpeed := 8.5;
               end;
               if UserRefreshRate=100 then
               begin
                    JumpSpeed := 0.12;
                    JumpHeight := 10;
                    MaxFallSpeed := 8.5;
               end;
               if UserRefreshRate=120 then
               begin
                    JumpSpeed := 0.12;
                    JumpHeight := 10;
                    MaxFallSpeed := 8.5;
               end;
               AnimPos:=0;
               case State of
                    StandRight: SetAnim('Jump', 0, 3, 0.06, False, False, True);
                    StandLeft: SetAnim('Jump', 0, 3, 0.06, False, True, True);
               end;
               TTile(Sprite).AnimPos:=0;
               TTile(Sprite).SetAnim('Spring1',0,6,0.2,False,False,True);
          end;
     end;

     // get green Apple
    if (Sprite is TGreenApple) then
    begin
         if TGreenApple(Sprite).JumpState= jsNone then
         begin
         //   MainForm.Music.Songs.Find('GetGreenApple').Play;
              TTile(Sprite).Dead;
         end;
    end;

    // jump fall and kill enemy
    if (Sprite is TEnemy) then
    begin
         if (jumpState=jsNone) or (JumpState=jsJumping) then
         begin
              // MainForm.Music.Songs.Find('Dead').Play;
              // MainForm.Music.Songs.Find('Music1').Stop;;
              State := Die;
              Sleep(1000);
              Collisioned := False;
              DoJump := True;
              JumpSpeed := 0.1;
              JumpHeight := 5;
              AnimPos := 0;
              SetAnim('Dead',0,6,0.1,True,False,True);
         end;
         if (jumpState=jsFalling) and (Y+100< TEnemy(Sprite).Y)  then
         begin
              // MainForm.Music.Songs.Find('Ka').Play;;
              JumpState := jsNone;
              DoJump := True;
              if UserRefreshRate = 85 then
              begin
                   JumpSpeed := 0.2;
                   JumpHeight := 7;
              end;
              if UserRefreshRate = 60 then
              begin
                   JumpSpeed := 0.5;
                   JumpHeight := 10;
              end;
              with TEnemy(Sprite) do
              begin
                   Y := Y-1;
                   State := Die;
                   Collisioned := False;
                   DoAnimate := False;
                   MirrorY := True;
                   DoJump := True;
                   JumpSpeed := 0.2;
                   JumpHeight := 5;
              end;
         end;
    end;
end;

constructor TActor.Create(const AParent: TSprite);
begin
     inherited;
     X := 810;
     Y := 200;
     CollideMode := cmRect;
     ImageName := 'Idle';
     AnimStart := 0;
     AnimCount := 12;
     AnimSpeed := 0.25;
     AnimLooped := True;
     DoAnimate := True;
     Collisioned := True;
     State := StandLeft;
     case UserRefreshRate of
          60: FMoveSpeed := 3;
          75: FMoveSpeed := 2.5;
          85: FMoveSpeed := 2;
          100: FMoveSpeed:= 1.5;
          120: FMoveSpeed:= 1;
     end;
     Animpos := 5;
     JumpSpeed := 0.2;
     JumpHeight := 8.5;
     MaxFallSpeed := 8;
     JumpState := jsjumping;
     State := StandRight;
end;

procedure TEnemy.DoMove(const MoveCount: Single);
begin
     inherited;
     CollideRect := Rect(Round(X),
                    Round(Y),
                    Round(X + Self.FCollideRight),
                    Round(Y + Self.FCollideBottom));
     if (State <> Die) then
     begin
          case State of
               WalkLeft:
               begin
                    if UserRefreshRate=60 then
                    begin
                         X := X - 1.5;
                         SetAnim(ImageName,0,AnimCount, 0.4, True, False, True);
                    end;
                    if UserRefreshRate=75 then
                    begin
                         X := X - 1.25;
                         SetAnim(ImageName,0,AnimCount, 0.35, True, False, True);
                    end;
                    if UserRefreshRate=85 then
                    begin
                         X := X - 1;
                         SetAnim(ImageName,0,AnimCount, 0.3, True, False, True);
                    end;
                    if UserRefreshRate=100 then
                    begin
                         X := X - 1;
                         SetAnim(ImageName, 0, AnimCount, 0.25, True, False, True);
                    end;
                     if UserRefreshRate = 120 then
                    begin
                         X:=X-0.5;
                         SetAnim(ImageName,0,AnimCount, 0.2, True, False, True);
                    end;
               end;
               WalkRight:
               begin
                    if UserRefreshRate = 60 then
                    begin
                         X := X + 1.5;
                         SetAnim(ImageName, 0, AnimCount, 0.4, True, True, True);
                    end;
                    if UserRefreshRate = 75 then
                    begin
                         X := X + 1.25;
                         SetAnim(ImageName,0,AnimCount, 0.35, True, True, True);
                    end;
                    if UserRefreshRate = 85 then
                    begin
                         X := X + 1;
                         SetAnim(ImageName, 0, AnimCount, 0.3, True, True, True);
                    end;
                     if UserRefreshRate = 100 then
                    begin
                         X := X + 1;
                         SetAnim(ImageName, 0, AnimCount, 0.25, True, True, True);
                    end;
                    if UserRefreshRate = 120 then
                    begin
                         X := X + 0.5;
                         SetAnim(ImageName, 0, AnimCount, 0.2, True, True, True);
                    end;
               end;
          end;
     end;
    if ImageName = 'Enemy3' then AnimSpeed := 0.15;
    if Y > 600 then Dead;
    Collision;
end;

procedure TEnemy.DoCollision(const Sprite: TSprite);
begin
     if(Sprite is TTile) then
     begin
          if (TTile(Sprite).ImageName='Ground1') or (TTile(Sprite).ImageName='Rock2' )then
          JumpState := jsNone;
          //  y:=TTile(sprite).Y-150;
          if TTile(Sprite).ImageName = 'Test1' then
          begin
               if State = WalkLeft then
               begin
                    X := X + 3;
                    State := WalkRight;
               end
               else
               begin
                    X := X - 3;
                    State := WalkLeft;
               end;
          end;
     end;
end;


function RenderFunc: Boolean;
begin
  HGE.Gfx_BeginScene;
  HGE.Gfx_Clear(0);
  Canvas.Draw(Images.Image['Back3'],0,0,0,Blend_Default);
  Canvas.DrawPart(Images.Image['Back2'],0,310,Trunc(Layer2Pos)-640,0,800,248,$FFFFFFFF,Blend_Default);
  Canvas.DrawPart(Images.Image['Back1'],0,330,Trunc(Layer1Pos)-640,0,800,240,$FFFFFFFF,Blend_Default);
  SpriteEngine.Draw;
  SpriteEngine.Move(1);
  SpriteEngine.Dead;
  Font.Print(100,100,IntToStr(UserRefreshRate));
  HGE.Gfx_EndScene;
  Result := False;
end;

procedure Main;
var
  I: Integer;
  MonitorFrequency: Integer;
  DC: THandle;
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;
  DC   := GetDC(HGE.System_GetState(HGE_HWND) );
  MonitorFrequency := GetDeviceCaps(DC, VREFRESH);
  case MonitorFrequency of
          60..70:UserRefreshRate:=60;
          71..75:UserRefreshRate:=75;
          76..85:UserRefreshRate:=85;
          86..100:UserRefreshRate:=100;
          101..120:UserRefreshRate:=120;
  end;

  if (HGE.System_Initiate) then
  begin
    Font:=TSysFont.Create;
    Font.CreateFont('arial',15,[]);
    LoadImages;
    LoadMapData('Stage1-1.map');
    CreateMap;
    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 + -