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

📄 uformmain.pas

📁 单机泡泡堂 程序及源代码
💻 PAS
📖 第 1 页 / 共 4 页
字号:
      if RCount <= 16 then
        Inc(RCount)
      else
        RCount := 0;
      if (X) > (Cnt_OffsetX + Cnt_MapWidth) then
        X := Cnt_OffsetX + Cnt_MapWidth;
      FAnimRun := TRUE;
      goto GotoRunBreak;
    end;
  end;

  GotoRunBreak:

  if isKeyChange and (TmpDir <> Dir) then
  begin
    OldDir := TmpDir;
  end;

  ModifyZIndex(x, y);
  Collision;

  if ID = 0 then
  begin

    if FormMain.DXInput.Keyboard.Keys[Ord('A')] then
    begin
      if CanDropBomb(x, y) and ((GetTickCount - FDropBombTimeOut) >
        Cnt_DropBombTimeOut) and (BombCount < MaxBombCount) then
      begin
        FDropBombTimeOut := GetTickCount;
        Bomb := TBombSprite.Create(FormMain.DXSpriteEngine.Engine,
          FormMain.Player1);
        //去掉其他的新炸弹
  //      for i := 0 to BombList.Count - 1 do
  //        TBombSprite(BombList.Items[i]).newBomb := FALSE;
        BombList.Add(Bomb);
      end;
    end;

  end
  else                                  //玩家二
  begin

    if FormMain.DXInput.Keyboard.Keys[Ord('/')] then
    begin
      if CanDropBomb(x, y) and ((GetTickCount - FDropBombTimeOut) >
        Cnt_DropBombTimeOut) and (BombCount < MaxBombCount) then
      begin
        FDropBombTimeOut := GetTickCount;
        Bomb := TBombSprite.Create(FormMain.DXSpriteEngine.Engine,
          FormMain.Player2);
        //去掉其他的新炸弹
//      for i := 0 to BombList.Count - 1 do
//        TBombSprite(BombList.Items[i]).newBomb := FALSE;
        BombList.Add(Bomb);
      end;
    end;
  end;

  //formMain.Caption := inttostr(Integer(Dir)) + ':' + inttostr(Integer(OldDIr));
end;

procedure TFormMain.InitPlayer;
var
  PerY              : Integer;
begin
  Player1 := TPlayerSprite.Create(DXSpriteEngine.Engine);
  Player1.Face.Image := DXImageList.Items.Find('player2');
  Player1.Face.Width := Player1.Face.Image.Width;
  Player1.Face.Height := Player1.Face.Image.Height;
  Player1.Face.AnimCount := Player1.Face.Image.PatternCount;
  Player1.Power := 1;
  Player1.Speed := 2000;
  Player1.MaxBombCount := 1;
  Player1.X := GetPlayerPos(0).X + Cnt_OffsetX;
  if Player1.Image.PatternHeight > Cnt_TileHeight then
    PerY := Player1.Image.PatternHeight - Cnt_TileHeight
  else
    PerY := 0;
  Player1.Y := GetPlayerPos(0).Y + Cnt_OffsetY - PerY;
  Player1.ID := 0;
  Player1.gameOver := false;
  PlayerList.AddObject('Player1', Player1);

  Player2 := TPlayerSprite.Create(DXSpriteEngine.Engine);
  Player2.Face.Image := DXImageList.Items.Find('player1');
  Player2.Face.Width := Player2.Face.Image.Width;
  Player2.Face.Height := Player2.Face.Image.Height;
  Player2.Face.AnimCount := Player2.Face.Image.PatternCount;
  Player2.Power := 2;
  Player2.Speed := 1500;
  Player2.MaxBombCount := 1;
  Player2.gameOver := false;
  Player2.X := GetPlayerPos(1).X + Cnt_OffsetX;
  if Player2.Image.PatternHeight > Cnt_TileHeight then
    PerY := Player2.Image.PatternHeight - Cnt_TileHeight
  else
    PerY := 0;
  Player2.Y := GetPlayerPos(1).Y + Cnt_OffsetY - PerY;
  Player2.ID := 1;
  PlayerList.AddObject('Player2', Player2);

  Player1.HP := 10;
  Player2.HP := 10;

end;

procedure TFormMain.InitScreen;
begin

  DXDraw.Finalize;

  if not (doFullScreen in DXDraw.Options) then
  begin
    StoreWindow;
    DXDraw.Cursor := crDefault;
    BorderStyle := bsNone;
    DXDraw.Options := DXDraw.Options + [doFullScreen];
  end;

  DXDraw.Initialize;

end;

function TPlayerSprite.GetLeft: double;
begin
  result := x;
end;

function TPlayerSprite.GetTop: double;
begin
  result := y;
end;

procedure TPlayerSprite.ModifyZIndex(x, y: Double);
var
  L                 : integer;
begin
  y := Y - cnt_PlayerTop + 1;
  L := Trunc(Y / Cnt_TileHeight) + 1;
  if L = 0 then
    Inc(l, 1);
  L := L * 2 + 1;
  Z := 0;
  Face.Z := L;
end;

procedure TPlayerSprite.SetLeft(value: double);
begin
  x := value;
end;

procedure TPlayerSprite.SetTop(value: double);
begin
  y := value;
end;

procedure TFormMain.InitMapTile;
var
  ix, iy, PerY      : Integer;
  TileImg, ObjImage, ObjImg1, ObjImg2: TPictureCollectionItem;
  ClientX, ClientY  : Integer;
  iZ                : Integer;
  ts                : TTileSprite;
  os                : TObjectSprite;
label
  setZIndex;
begin
  // 600 X 520 的图像大小,块大小为40像素
  TileImg := DXImageList.Items.Find('tile');
  ObjImg1 := DXImageList.Items.Find('building');
  ObjImg2 := DXImageList.Items.Find('box');

  for ix := 0 to Cnt_TileWidthCount do
  begin
    iZ := 0;
    for iy := 0 to Cnt_TileHeightCount do
    begin
      ClientX := iX * Cnt_TileWidth + Cnt_OffsetX;
      ClientY := iY * Cnt_TileHeight + Cnt_OffsetY;
      if mapTile[ix, iy].TileIndex > 0 then
      begin
        ts := TTileSprite.Create(DXSpriteEngine.Engine);
        with ts do
        begin
          Image := TileImg;
          Width := Image.Width;
          Height := Image.Height;
          X := ClientX;
          Y := ClientY;
          Z := -1;
          Tile := TRUE;
          isBackground := TRUE;
          ShowZIndex := FALSE;
          AnimStart := mapTile[ix, iy].TileIndex - 1;
          BX := ix;
          BY := iy;
        end;
        TileList.AddObject('ts', ts);
      end;

      Inc(Iz, 2);

      if mapTile[ix, iy].ObjIndex < 1 then
        goto SetZIndex;

      if mapTile[iX, iy].CanDestroy and (mapTile[ix, iy].ObjIndex <> 5) then
        //能摧毁的则是箱子之类的建筑
        ObjImage := ObjImg2
      else
        ObjImage := objImg1;

      //调整显示的坐标位置
      if ObjImage.PatternHeight > Cnt_TileHeight then
        PerY := ObjImage.PatternHeight - Cnt_TileHeight
      else
        PerY := 0;

      os := TObjectSprite.Create(DXSpriteEngine.Engine);
      with os do
      begin
        Face := TImageSprite.Create(DXSpriteEngine.Engine);
        Face.Image := ObjImage;
        Face.Width := Face.Image.Width;
        Face.Height := Face.Image.Height;
        Face.X := ClientX;
        Face.Y := ClientY - PerY;
        if (mapTile[ix, iy].ObjIndex = 5) then
          Face.Z := iZ + 1
        else
          Face.Z := iZ;
        Face.AnimStart := mapTile[ix, iy].ObjIndex - 1;
        Image := DXImageList.Items.Find('P');
        Width := Image.Width - 4;
        Height := Image.Height - 4;
        X := ClientX;
        Y := ClientY;                   // - PerY;
        Z := 0;
        Tile := TRUE;
        BX := ix;
        BY := iy;
      end;
      TileList.AddObject('os', os);

      SetZIndex:
    end;

  end;
end;

{ TTileSprite }

procedure TTileSprite.DoDraw;
var
  ImageIndex        : Integer;
  r                 : TRect;
begin
  ImageIndex := SELF.AnimStart + Trunc(SELF.AnimPos);
  r := Rect(Trunc(Self.WorldX), Trunc(Self.WorldY), Trunc(Self.WorldX) +
    Image.Width, Trunc(Self.WorldY) + Image.Height);
  Image.Draw(Engine.Surface, r.Left, r.Top, ImageIndex);
  if ShowZIndex then
    with Engine.Surface.Canvas do
    begin
      Brush.Style := bsClear;
      Font.Color := clBlue;

      Font.Size := 12;
      TextOut(Trunc(X), Trunc(y), Inttostr(Z));
      Release;
    end;
end;

procedure TPlayerSprite.SetZIndex(Z: integer);
begin
  Face.Z := Z;
end;

{ TObjectSprite }

procedure TObjectSprite.DoDraw;
begin
  //屏蔽绘图过程
  if ShowZIndex then
    FormMain.Caption := FloatToStr(X) + ',' + FloatToStr(Y);
end;

{ TBomb }

procedure TBombSprite.BuilderFire;

  procedure SetObjectDead(ix, iy: Integer);
  var
    i               : Integer;
    //    oi              : Integer;
  begin
    with formMain do
      for i := TileList.Count - 1 downto 0 do
        if TileList.Objects[i] <> nil then
          if TileList.Strings[i] = 'os' then
            if TileList.Objects[i] is TObjectSprite then
              if ((TileList.Objects[i] as TObjectSprite).BX = ix) and
                ((TileList.Objects[i] as TObjectSprite).BY = iy) then
              begin
                if MapTile[ix, iy].CanDestroy or (MapTile[ix, iy].ObjIndex = 5)
                  then
                begin
                  //oi := MapTile[ix, iy].ObjIndex;
                  //建立宝物
                  if (TileList.Objects[i] as TObjectSprite).Face.Image.Name =
                    'box' then
                  begin
                    Randomize;
                    if (Max(Abs(Random(999)), 1) mod 2) = 0 then
                    begin
                      with TGoodsSprite.Create(Engine) do
                      begin
                        X := (TileList.Objects[i] as TObjectSprite).Face.X;
                        Y := (TileList.Objects[i] as TObjectSprite).Face.Y;
                        Z := (TileList.Objects[i] as TObjectSprite).Face.Z;
                      end;
                    end;
                  end;

                  MapTile[ix, iy].ObjIndex := 0;
                  MapTile[ix, iy].CanDestroy := TRUE;
                  (TileList.Objects[i] as TObjectSprite).Face.Dead;
                  (TileList.Objects[i] as TObjectSprite).Dead;
                  TileList.Objects[i] := nil;

                  //TileList.Delete(i);
                  { if oi = 4 then
                     Continue;  }
                  //break;
                end;
              end;
  end;

var
  I                 : integer;
  FireSprite        : TFireSprite;
  MaxPower          : integer;
  aniIndex          : integer;
  Ix, iY            : integer;
  ZIndex            : integer;
begin
  for i := RefPlayer.BombList.Count - 1 downto 0 do
    if RefPlayer.BombList.Items[i] <> nil then
      if (TBombSprite(RefPlayer.BombList.Items[i]).BX = bx) and
        (TBombSprite(RefPlayer.BombList.Items[i]).BY = by) then
      begin
        RefPlayer.BombList.Delete(i);
        break;
      end;

  Face.Dead;
  Dead;

  RefPlayer.BombCount := refPlayer.BombCount - 1;
  ZIndex := 999;
  MaxPower := refPlayer.Power;
  //炸弹中心
  FireSprite := TFireSprite.Create(Parent);
  FireSprite.X := X;
  FireSprite.Y := Y;
  FireSprite.AnimStart := 0;
  FireSprite.Z := ZIndex;

  //draw Up
  Ix := bx;
  iY := by;

  for i := 1 to MaxPower do
  begin

    if iy - i >= 0 then
    begin
      if FormMain.MapTile[ix, (iy - i)].ObjIndex > 0 then
        if not FormMain.MapTile[ix, (iy - i)].CanDestroy then //如果是墙
          break
        else                            //如果能销毁则让碰撞事件处理
        begin
          SetObjectDead(ix, (iy - i));
          break;
        end;
    end
    else
      Break;                            //墙边

    FireSprite := TFireSprite.Create(Parent);
    FireSprite.X := X;
    FireSprite.Y := Y - (i * Cnt_TileHeight);

    if i < MaxPower then
      aniIndex := 1
    else
      aniIndex := 5;

    FireSprite.AnimStart := aniIndex;
    FireSprite.Z := ZIndex;
    FireSprite.DoDraw;
  end;

  //draw Down
  for i := 1 to MaxPower do
  begin

    if iy + i <= Cnt_TileHeightCount then
    begin
      if FormMain.MapTile[ix, (iy + i)].ObjIndex > 0 then
        if not FormMain.MapTile[ix, (iy + i)].CanDestroy then //如果是墙
          break
        else                            //如果能销毁则让碰撞事件处理
        begin
          SetObjectDead(ix, (iy + i));
          break;
        end;
    end
    else
      Break;                            //墙边

    FireSprite := TFireSprite.Create(Parent);
    FireSprite.X := X;
    FireSprite.Y := Y + (i * Cnt_TileHeight);

    if i < MaxPower then
      aniIndex := 1
    else
      aniIndex := 4;

    FireSprite.AnimStart := aniIndex;
    FireSprite.Z := ZIndex;
    FireSprite.DoDraw;
  end;

  //draw Left
  for i := 1 to MaxPower do
  begin
    if ix - i >= 0 then
    begin
      if FormMain.MapTile[(ix - i), iy].ObjIndex > 0 then
        if not FormMain.MapTile[(ix - i), iy].CanDestroy then //如果是墙
          break
        else                            //如果能销毁则让碰撞事件处理
        begin
          SetObjectDead((ix - i), iy);
          break;
        end;
    end
    else
      Break;                            //墙边

    FireSprite := TFireSprite.Create(Parent);
    FireSprite.X := X - (i * Cnt_TileWidth);
    FireSprite.Y := Y;

    if i < MaxPower then
      aniIndex := 2
    else
      aniIndex := 7;

    FireSprite.AnimStart := aniIndex;
    FireSprite.Z := ZIndex;
    FireSprite.DoDraw;

⌨️ 快捷键说明

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