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

📄 scenemainunit.pas

📁 Delphi Engine for games.
💻 PAS
📖 第 1 页 / 共 2 页
字号:
  With TGameUnit.Create(MainForm.SpriteEngine.Engine) do
   begin
    UnitName:='Player2Spr';
    Direction:=Random(8);

    FChipH:=ChipH;
    FChipW:=ChipW;

    X:=50 + 120*i;
    Y:=400;
    Z := Trunc(Y);

    Life             := 20;
    FLifeMax         := 20;
    FDamage          := 1;
    FAttackRange     := 200;
    FSight           := 200;
    FSpeed           := 75/1000;

    FAllyID          := 2;
    FUnitColor       :=DXBlue;
   end;
  end;


  Navigator:=TDXWNavigator.Create;
  Navigator.InitLeft:=468;
  Navigator.InitTop:=22;
  Navigator.InitWidth:=150;
  Navigator.InitHeight:=150;
  Navigator.MapW:=MapW;
  Navigator.MapH:=MapH;
  Navigator.SpriteEngine:=MainForm.SpriteEngine;


  ScrollBackground.MakeMiniMap;


  FBtnList.Add(TDXImageButton.Create);
  With TDXImageButton(FBtnList[FBtnList.Count-1]) do
   begin
    Image := MainForm.TmpImageList2.Items.Find('BtnGameMenu');
    Width := Image.Width;
    Height := Image.Height;
    X := 468;
    Y := 3;
    Surface:=MainForm.DXDraw.Surface;
   end;

end;


procedure SceneMainMouseDown(Shift: TShiftState; X, Y: Integer);
Var
 i,n             : integer;
 r               : TRect;
 ClickedSprite   : TSprite;
 SelSprites      : TList;
 BaseX,BaseY     : Double;
 dX,dY           : Double;

 MapX,MapY       : Double;
 DestX,DestY     : Double;

 dL,dLmin        : Double;
 DownPoint       : TPoint;
begin
DownPoint:=Point(X,Y);

MapX:=(-MainForm.SpriteEngine.Engine.X)+X;
MapY:=(-MainForm.SpriteEngine.Engine.Y)+Y;

MapDownPointX:=MapX;
MapDownPointY:=MapY;

if SubSceneMainMenuEnabled
then SubSceneMainMenuMouseDown(Shift,X,Y)
else
begin

r:= MainForm.SpriteEngine.Engine.SurfaceRect;
if PtInRect(r,DownPoint)then
  begin
   if (ssLeft in Shift) then StartSelection := True;

   ClickedSprite:=MainForm.SpriteEngine.Engine.GetSpriteAt(DownPoint.X,DownPoint.Y);

   if (ClickedSprite is TWImageSprite)and(ssLeft in Shift) then
   begin
    For i:=0 to MainForm.SpriteEngine.Engine.AllCount-1 do
     if MainForm.SpriteEngine.Engine.Items[i] is TWImageSprite
      then TWImageSprite(MainForm.SpriteEngine.Engine.Items[i]).Selected:=false;
    With TWImageSprite(ClickedSprite) do
     begin
      Selected:=true;
      CanMove:=false;
     end;
   end;


   if (ClickedSprite=nil) and (ssRight in Shift) then
   begin
    DestX:=MapX;
    DestY:=MapY;

    if Not ScrollBackground.Obstacle[Trunc(DestY/ChipH),Trunc(DestX/ChipW)] then
    begin

     SelSprites:=TList.Create;
     try

     For i:=0 to MainForm.SpriteEngine.Engine.AllCount-1 do
      if (MainForm.SpriteEngine.Engine.Items[i] is TWImageSprite) and
         (TWImageSprite(MainForm.SpriteEngine.Engine.Items[i]).Selected)
       then
         SelSprites.Add(TWImageSprite(MainForm.SpriteEngine.Engine.Items[i]));

     if SelSprites.Count=0 then Exit;

     i:=0;
     dx:=(DestX-TWImageSprite(SelSprites[i]).X);
     dy:=(DestY-TWImageSprite(SelSprites[i]).Y);
     dLmin:=dx*dx+dy*dy;
     n:=0;

     For i:=1 to SelSprites.Count-1 do
     begin
      dx:=(DestX-TWImageSprite(SelSprites[i]).X);
      dy:=(DestY-TWImageSprite(SelSprites[i]).Y);
      dL:=dx*dx+dy*dy;
      if dL<dLmin then
       begin
        dLmin:=dL;
        n:=i;
       end;
     end;
     BaseX:=TWImageSprite(SelSprites[n]).X;
     BaseY:=TWImageSprite(SelSprites[n]).Y;

     For i:=0 to SelSprites.Count-1 do
      With TWImageSprite(SelSprites[i]) do
       begin
           dX:=BaseX-X;
           dY:=BaseY-Y;

           DestPointX:=(-MainForm.SpriteEngine.Engine.X)+DownPoint.X-dX;
           DestPointY:=(-MainForm.SpriteEngine.Engine.Y)+DownPoint.Y-dY;

           DestChipX:=Trunc(DestPointX/ChipW);
           DestChipY:=Trunc(DestPointY/ChipH);

           While ScrollBackground.Obstacle[DestChipY,DestChipX] do
            begin
             dX:=(Abs(dX)-ChipW)*Sign(dX);
             DestPointX:=(-MainForm.SpriteEngine.Engine.X)+DownPoint.X-dX;
             DestChipX:=Trunc(DestPointX/ChipW);
             if Not ScrollBackground.Obstacle[DestChipY,DestChipX]
              then Break;

             dY:=(Abs(dY)-ChipH)*Sign(dY);
             DestPointY:=(-MainForm.SpriteEngine.Engine.Y)+DownPoint.Y-dY;
             DestChipY:=Trunc(DestPointY/ChipH);
            end;

           FindPath(Point(ChipX,ChipY),Point(DestChipX,DestChipY));
           if FindPath(Point(ChipX,ChipY),Point(DestChipX,DestChipY)) then
            begin
             DirChangedXYCount:=PathInf.DirChangedPointsCount;
             CurrentDirChangedXYId:=0;
             SetLength(DirChangedXYArr,DirChangedXYCount);
             For n:=0 to DirChangedXYCount-1 do
             begin
              DirChangedXYArr[n].x:=PathInf.DirChangedPointsArr[n].Point.x*ChipW + ChipW div 2;
              DirChangedXYArr[n].y:=PathInf.DirChangedPointsArr[n].Point.y*ChipH + ChipH div 2;
              DirChangedXYArr[n].Dir:=PathInf.DirChangedPointsArr[n].Dir;
             end;
            end
            else Exit;

           CanMove:=true;
           //DestPointLocked:=False;
           //DestPointOriented:=False;


     end;//i
     finally
      SelSprites.Free;
     end;
    end;//if Not Obstacle
   end;//if (ClickedSprite=nil) and (ssRight in Shift)
end//if PtInRect(r,DownPoint)
else
  begin
   Navigator.NavigatorMouseDown(Shift,X,Y);
  end;

  begin
   For i:=0 to FBtnList.Count-1 do
    begin
     r:=TDXImageButton(FBtnList[i]).BoundsRect;
     if PtInRect(r,DownPoint)
      then TDXImageButton(FBtnList[i]).Selected:=true;
    end;
  end;
end;

end;


procedure EndSceneMain;
Var
 i: integer;
begin
Navigator.Free;

MainForm.TmpImageList2.Items.Clear;
MainForm.SpriteEngine.Engine.Clear;

MainForm.DXWaveList.Items.Clear;

For i:=0 to FBtnList.Count-1
 do TDXImageButton(FBtnList[i]).free;
FBtnList.Clear;
end;

procedure SceneMainMouseUp(Shift: TShiftState; X, Y: Integer);
begin
StartSelection := false;

Navigator.NavigatorMouseUp(Shift,X,Y);

if Not SubSceneMainMenuEnabled then
 begin
 if TDXImageButton(FBtnList[0]).Selected then
  begin
   TDXImageButton(FBtnList[0]).Selected:=False;
   StartSubSceneMainMenu;
  end;
 end else SubSceneMainMenuMouseUp(Shift,X,Y);
end;

procedure SceneMainMouseMove(Shift: TShiftState; X, Y: Integer);
Var
 i          : integer;
 GroupR     : TRect;
 WX,WY      : integer;
begin
if SubSceneMainMenuEnabled
then SubSceneMainMenuMouseMove(Shift,X,Y)
else
begin
Navigator.NavigatorMouseMove(Shift,X,Y);

if (StartSelection)and(ssLeft in Shift)then
 With MainForm do
 begin
  if X>SpriteEngine.Engine.Width
   then X:=SpriteEngine.Engine.Width;

  WX:=Trunc(MapDownPointX+SpriteEngine.Engine.X);
  WY:=Trunc(MapDownPointY+SpriteEngine.Engine.Y);

  GroupR:=Rect(min(WX,X),min(WY,Y),max(WX,X),max(WY,Y));

  For i:=0 to SpriteEngine.Engine.AllCount-1 do
   if SpriteEngine.Engine.Items[i] is TWImageSprite then
    With TWImageSprite(SpriteEngine.Engine.Items[i]) do
     if OverlapRect(GroupR,BoundsRect)
      then Selected:=true
       else Selected:=false;

 end;
end;
end;

procedure OutSelSpriteInf;
Var
i,n : integer;
S: String;
DestX,DestY : integer;
begin

with MainForm,  MainForm.DXDraw.Surface.Canvas do
try

For i:=0 to SpriteEngine.Engine.AllCount-1 do
begin
 if SpriteEngine.Engine.Items[i] is TGameUnit then
  begin
   With TGameUnit(SpriteEngine.Engine.Items[i]) do
    begin
     if Selected then
     begin

       Pen.Color:=clYellow;
       DestX:=Trunc(DestPointX+SpriteEngine.Engine.X);
       DestY:=Trunc(DestPointY+SpriteEngine.Engine.Y);
       Ellipse(DestX-5,DestY-5,DestX+5,DestY+5);


       if  DirChangedXYCount>0 then
       begin
          n:=0;
          DestX:=Trunc(DirChangedXYArr[n].X+SpriteEngine.Engine.X);
          DestY:=Trunc(DirChangedXYArr[n].Y+SpriteEngine.Engine.Y);
          MoveTo(DestX,DestY);
        For n:=1 to DirChangedXYCount-1 do
         begin
          DestX:=Trunc(DirChangedXYArr[n].X+SpriteEngine.Engine.X);
          DestY:=Trunc(DirChangedXYArr[n].Y+SpriteEngine.Engine.Y);
          LineTo(DestX,DestY);
         end;
       end;



        Brush.Style := bsClear;
        Font.Color := clWhite;
        //Font.Name := 'MS Sans Serif';
        Font.Name := 'Arial';
        Font.Size := 7;


        //Textout(480, 50, format('Name: %s',[FName]));
        Textout(480, 60, format('Life: %d',[Life]));


        Textout(480, 260, format('XYZ: %.0f,%.0f / %d',[X,Y,Z]));
        Textout(480, 270, format('WXY: %.0f,%.0f',[WorldX,WorldY]));


        //Textout(480, 290, format('Direction: %d',[Direction]));
        //Textout(480, 300, format('DestXY: %.0f %.0f',[DestPointX,DestPointY]));

        //Textout(480, 310, format('ChipXY: %d %d',[ChipX,ChipY]));
        //Textout(480, 320, format('DestChipXY: %d %d',[DestChipX,DestChipY]));

        {
        if CanMove
        then Textout(480, 330, format('CanMove: %S',['true']))
        else Textout(480, 330, format('CanMove: %S',['false']));
        }
        {
        Textout(480, 320, format('AnimIndex: %d',[AnimIndex]));
        Textout(480, 330, format('AnimPos: %.0f',[AnimPos]));
        Textout(480, 340, format('AnimStart: %d',[AnimStart]));
        Textout(480, 350, format('AnimCount: %d',[AnimCount]));
        //Textout(480, 360, format('Image.PatternCount: %d',[Image.PatternCount]));
        }
        {
        S:='';
        if osMove in FObjectState then S:=S+' osMove ';
        if osCollided in FObjectState then S:=S+' osCollided ';
        Textout(480, 380, format('State: %S',[S]));
        }

        Exit;

     end;//if selected
    end;//With TPlayer1
  end;
end;// i: For i:=0 to SpriteEngine.Engine.AllCount-1 do

finally
 Release;
end;

end;

end.

⌨️ 快捷键说明

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