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

📄 scenemainunit.pas

📁 Delphi Engine for games.
💻 PAS
📖 第 1 页 / 共 2 页
字号:
//UnTitledRTS for UnDelphiX
unit SceneMainUnit;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls, DXClass, DXSprite, DXInput, DXDraws,
  DXSounds, DIB , DXWStatObj,DXWPath, DXWImageSprite;


 Var
   StartSelection   : boolean;

 procedure StartSceneMain;
 procedure SceneMain;
 procedure EndSceneMain;
 procedure ScrollSpriteEngine;
 procedure WatchForEnemy;
 procedure Attack;


 procedure SceneMainMouseDown(Shift: TShiftState; X, Y: Integer);
 procedure SceneMainMouseUp(Shift: TShiftState; X, Y: Integer);
 procedure SceneMainMouseMove(Shift: TShiftState; X, Y: Integer);

 procedure OutSelSpriteInf;

implementation
Uses Main,GameSpritesUnit,Menu, DXWNavigator, Pathes ;

procedure ScrollSpriteEngine;
Const
 StepScroll=20;
Var
  dx,dy,ScrollCount : integer;
  NewX,NewY : double;
  Xmax,Xmin,Ymax,Ymin : double;
begin
With MainForm do begin

Xmax:=0;
Ymax:=0;
Xmin:=SpriteEngine.Engine.Width-MapW;
Ymin:=SpriteEngine.Engine.Height-MapH;

if DXTimer.FrameRate=0
 then ScrollCount:=Trunc(StepScroll)
  else ScrollCount:=Trunc(StepScroll*(80/DXTimer.FrameRate));

dx:=0;
dy:=0;
if MouseXY.Y=0 then dy:=ScrollCount;
if MouseXY.Y=479 then dy:=-ScrollCount;//(480-1)
if MouseXY.X=0 then dx:=ScrollCount;
if MouseXY.X=639 then dx:=-ScrollCount;//(640-1)

if ( isUp in DXInput.States )then dy:=ScrollCount;
if ( isDown in DXInput.States )then dy:=-ScrollCount;
if ( isLeft in DXInput.States )then dx:=ScrollCount;
if ( isRight in DXInput.States )then dx:=-ScrollCount;

NewX:=SpriteEngine.Engine.X+dx;
NewY:=SpriteEngine.Engine.Y+dy;
if ( NewX<=Xmax ) and ( NewX>=Xmin )
 then SpriteEngine.Engine.X:=NewX
 else
  if NewX>Xmax
   then SpriteEngine.Engine.X:=Xmax
    else SpriteEngine.Engine.X:=Xmin;

if ( NewY<=Ymax ) and ( NewY>=Ymin )
 then SpriteEngine.Engine.Y:=NewY
 else
  if NewY>Ymax
   then SpriteEngine.Engine.Y:=Ymax
    else SpriteEngine.Engine.Y:=Ymin;

end;
end;

procedure WatchForEnemy;
Var
 i     : integer;


begin
// need  optimiztion
 With MainForm do
 begin
 //Zprofiler.mark(1,true);


  For i:=0 to MainForm.SpriteEngine.Engine.AllCount-1 do
   if (MainForm.SpriteEngine.Engine.Items[i] is TGameUnit)
    then TGameUnit(MainForm.SpriteEngine.Engine.Items[i]).doWatchForEnemy;


{
   i := -1;
   repeat
    i := MainForm.SpriteEngine.Engine.FindInstanceOf(TGameUnit, false, i+1);
    if i >= 0
     then TGameUnit(MainForm.SpriteEngine.Engine.Items[i]).doWatchForEnemy;
   until(i < 0);
}

 //Zprofiler.mark(1,false);
 end;
end;

procedure Attack;
Var
 i     : integer;
begin
// need  optimiztion
 With MainForm do
 begin
  For i:=0 to MainForm.SpriteEngine.Engine.AllCount-1 do
   if (MainForm.SpriteEngine.Engine.Items[i] is TGameUnit)
    then TGameUnit(MainForm.SpriteEngine.Engine.Items[i]).doAttack;
 end;
end;


procedure SceneMain;
Const
 StepMove=25;// (1000/40)
 Counter : LongInt=0;
Var
  i     : integer;
  selX  : integer;
begin
With MainForm do begin

if DXTimer.FrameRate=0
 then SpriteEngine.Move(Trunc(StepMove))
  else SpriteEngine.Move(Trunc(StepMove*(80/DXTimer.FrameRate)));

SpriteEngine.Dead;

ScrollSpriteEngine;


//simple AI
If Counter>(DXTimer.FrameRate div 2) then// no need exectly
  begin
   WatchForEnemy;
   Counter:=0;
  end
   else Inc(Counter);
Attack;


DXDraw.Surface.Fill(0);// may do not this
if FNextScene=gsNone then
  begin
   SpriteEngine.Draw;

   //TmpImageList2.Items.Find('Map1_1').Draw(DXDraw.Surface,0,0, 0);
   //TmpImageList2.Items.Find('Map1_2').Draw(DXDraw.Surface,22,0, 0);
   //TmpImageList2.Items.Find('Map1_3').Draw(DXDraw.Surface,22,458, 0);
   TmpImageList2.Items.Find('Map1_4').Draw(DXDraw.Surface,446,0, 0);

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

   Navigator.DrawSelf;

   if SubSceneMainMenuEnabled then SubSceneMainMenu;

//---------- Frame rate display and GroupeSelRect---------
    with DXDraw.Surface.Canvas do
    begin

    if StartSelection then
     begin
      Pen.Color:=clGreen;
      Pen.Style:=psDot;
      Pen.Width:=1;

      if MouseXY.X >SpriteEngine.Engine.Width
       then selX:=SpriteEngine.Engine.Width
        else selX:=MouseXY.X;

      Rectangle(Trunc(MapDownPointX+SpriteEngine.Engine.X),
                Trunc(MapDownPointY+SpriteEngine.Engine.Y),
                selX,MouseXY.Y);
     end;
    Pen.Style:=psSolid;


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

    //Textout(480, 150, 'FPS: '+inttostr(DXTimer.FrameRate));
    //Textout(480, 160, 'Sprite: '+inttostr(SpriteEngine.Engine.AllCount));
    Textout(480, 160, 'Sprite: '+inttostr(SpriteEngine.Engine.Count));

    Textout(480, 170, 'Draw: '+inttostr(SpriteEngine.Engine.DrawCount));


    Textout(480, 180, format('Engine.W/H: %d,%d ',[SpriteEngine.Engine.Width,SpriteEngine.Engine.Height]));
    Textout(480, 190, format('Engine.XY: %.0f,%.0f ',[SpriteEngine.Engine.X,SpriteEngine.Engine.Y]));
    Textout(480, 200, format('Engine.WorldXY: %.0f,%.0f ',[SpriteEngine.Engine.WorldX,SpriteEngine.Engine.WorldY]));
    Textout(400, 210, format('Engine.SerfaseRect: %d,%d,%d,%d ',
           [SpriteEngine.Engine.SurfaceRect.left,
            SpriteEngine.Engine.SurfaceRect.top,
            SpriteEngine.Engine.SurfaceRect.Right,
            SpriteEngine.Engine.SurfaceRect.Bottom]));
    Textout(400, 220, format('Engine.BoundsRect: %d,%d,%d,%d ',
           [SpriteEngine.Engine.BoundsRect.left,
            SpriteEngine.Engine.BoundsRect.top,
            SpriteEngine.Engine.BoundsRect.Right,
            SpriteEngine.Engine.BoundsRect.Bottom]));

    Textout(480, 230, format('MapW/H: %d,%d ',[MapW,MapH]));


    Textout(400, 240, format('ScrollBackground.WorldXY: %.0f,%.0f ',[ScrollBackground.WorldX,ScrollBackground.WorldY]));
    Textout(400, 250, format('ScrollBackground.XY: %.0f,%.0f ',[ScrollBackground.X,ScrollBackground.Y]));



    Release;
    end;
    OutSelSpriteInf;
  end;
end;
end;



procedure StartSceneMain;
Var
 i, j    : Integer;
 FileName : string;
begin
 MainForm.SpriteEngine.Engine.SurfaceRect :=Rect(0,0,446,480);

 FileName:='MainFon.dxg';
 MainForm.LoadPicData(MainForm.TmpImageList2,FileName);
 //MainForm.TmpImageList2.Items.LoadFromFile(GetName('Graphics\DXG',FileName));
 MainForm.SavePicData(MainForm.TmpImageList2,FileName);

 FileName:='GameSprites.dxg';
 MainForm.LoadPicData(MainForm.ImageList,FileName);
 //MainForm.ImageList.Items.LoadFromFile(GetName('Graphics\DXG',FileName));
 MainForm.SavePicData(MainForm.ImageList,FileName);

 MainForm.LoadWaves;
 //MainForm.DXWaveList.Items.LoadFromFile(GetName('Sound\DXW','SpriteEffect.dxw'));

 //FScore := 0;
 //FEnemyAdventPos := 0;
 //FFrame := 0;

{
  For i:=1 to 5 do begin
  With TPlayer2.Create(SpriteEngine.Engine) do
   begin
    X:=50 + 70*i;
    Y:=100;
    Z := Trunc(Y);
   end;
  end;
}

{  Cursor object  }
//  CursorSprite:=TCursorSprite.Create(SpriteEngine.Engine);


  {
  With  TBuilding.Create(SpriteEngine.Engine) do
   begin
   Image := MainForm.ImageList.Items.Find('Castle');
   Width := Image.Width;
   Height := Image.Height;
   //PixelCheck:=true;
   X := 150;
   Y := 300;
   Z := Trunc(Y);
   end;


 Randomize;
 For i:=1 to 30 do begin
  With  TBuilding.Create(SpriteEngine.Engine) do
   begin
   Image := MainForm.ImageList.Items.Find('Trees');
   Width := Image.Width;
   Height := Image.Height;
   //PixelCheck:=true;

   if i<=15 then
   begin
   X := -1800+ 200*i;
   Y := 0;
   Z := Trunc(Y);
   end
   else
   begin
   X := -1800+ 200*(i-15);
   Y := 450;
   Z := Trunc(Y);
   end;

   end;
  end;


 With  TBuilding.Create(SpriteEngine.Engine) do
   begin
   Image := MainForm.ImageList.Items.Find('Mine');
   Width := Image.Width;
   Height := Image.Height;
   //PixelCheck:=true;
   X := 350;
   Y := 350;
   Z := Trunc(Y);
   end;
}



//  Background //  Background //  Background //  Background //  Background //  Background
  ScrollBackground:=TScrollBackground.Create(MainForm.SpriteEngine.Engine);
  //ScrollBackground.LoadObstacle;

  ScrollBackground.LoadMap(GetName('Map','Test2.map'));

  PathInf:=TDXPath.Create(DimW,DimH);
  For j :=0 to (DimH-1) do
   For i :=0 to(DimW-1) do

    PathInf.FObstacle[j,i]:=ScrollBackground.Obstacle[j,i];

  For i:=1 to 5 do begin
  With TGameUnit.Create(MainForm.SpriteEngine.Engine) do
   begin
    UnitName:='Player1Spr';
    Direction:=Random(8);

    FChipH:=ChipH;
    FChipW:=ChipW;

    X:=150 + 90*i;
    Y:=130;

    //X:=Random(MapW);
    //Y:=Random(MapH);

    Z := Trunc(Y);

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

    FAllyID          := 1;
    FUnitColor       :=DXRed;

   end;
  end;

  For i:=1 to 5 do begin

⌨️ 快捷键说明

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