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

📄 uformmain.pas

📁 单机泡泡堂 程序及源代码
💻 PAS
📖 第 1 页 / 共 4 页
字号:
  end;

  //draw Right
  for i := 1 to MaxPower do
  begin
    if ix + i <= Cnt_TileWidthCount 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 := 6;

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

end;

constructor TBombSprite.Create(AParent: TSprite; Player: TPlayerSprite);
var
  i, j, clientx, clienty: integer;
begin
  inherited Create(AParent);

  //  RefPlayer := FormMain.Player;
  Image := FormMain.DXImageList.Items.Find('p');
  Width := Cnt_TileWidth - 4;
  Height := Cnt_TileHeight - 4;
  refPlayer := Player;

  i := Trunc(refPlayer.X - cnt_OffsetX) div Cnt_TileWidth;
  j := Trunc(refPlayer.Y - cnt_OffsetY) div Cnt_TileHeight;

  clientX := i * Cnt_TileWidth + cnt_OffsetX;
  clientY := j * Cnt_TileHeight + cnt_OffsetY;

  refPlayer.BombCount := refPlayer.BombCount + 1;

  if (refPlayer.X - clientX) > (cnt_TileWidth div 2) then
  begin
    inc(i, 1);
    clientX := clientX + cnt_TileWidth;
  end;
  if (refPlayer.Y - clientY) > (cnt_TileHeight div 2) then
  begin
    inc(j, 1);
    clientY := clientY + cnt_TileHeight;
  end;

  BX := i;
  BY := j;
  X := clientX;
  Y := clientY;
  Z := 0;

  PixelCheck := FALSE;
  Tile := TRUE;
  newBomb := True;

  Face := TBombTileSprite.Create(AParent);
  Face.Image := formMain.DXImageList.Items.Find('boom');
  Face.Width := Face.Image.Width;
  Face.Height := Face.Image.Height;
  Face.X := clientX - 2;
  Face.Y := clientY - 2;
  Face.Z := refPlayer.Z + 1;
  Face.AnimCount := Face.Image.PatternCount - 1;
  Face.AnimLooped := True;
  Face.AnimSpeed := 35 / 1000;
  Face.PixelCheck := FALSE;
  FBombTimeOut := GetTickCount;
end;

procedure TBombSprite.DoDraw;
begin
  if (GetTickCount - FBombTimeOut) > Cnt_BombTimeOut then
  begin
    BuilderFire;
  end;
end;

procedure TBombSprite.DoMove(MoveCount: Integer);
begin
  inherited;
  //  Exit;
    //如果炸弹不和玩家在同一位置,则newBomb 属性为 FALSE,(永远为false)
  if NewBomb then                       //如果newBomb =true
  begin
    //玩家所在位置

    if (Abs(refPlayer.X - X) > (cnt_TileWidth + 2)) or
      (Abs(refPlayer.Y - y) > (cnt_TileHeight + 2)) then
      NewBomb := FALSE;
    exit;

  end;

end;

{ TFireSprite }

constructor TFireSprite.Create(AParent: TSprite);
begin
  inherited;
  Image := FormMain.DXImageList.Items.Find('boob');
  Width := Cnt_TileWidth;
  Height := Cnt_TileHeight;
  FFireTimeOut := GetTickCount;
end;

procedure TFireSprite.DoCollision(Sprite: TSprite; var Done: Boolean);
//var
//  ix, iy            : integer;
begin
  inherited;
  if Sprite is TBombSprite then
  begin
    (Sprite as TBombSprite).BuilderFire;
    (Sprite as TBombSprite).dead;
  end;

  if Sprite is TPlayerSprite then
  begin
    Self.Z := (Sprite as TPlayerSprite).Z - 1;
    (Sprite as TPlayerSprite).HP := (Sprite as TPlayerSprite).HP - 1;
    if (Sprite as TPlayerSprite).hp <= 0 then
      (Sprite as TPlayerSprite).ShowDead := TRUE;
    Dead;
  end;

end;

procedure TFireSprite.DoDraw;
begin
  inherited;
  if (GetTickCount - FFireTimeOut) > Cnt_FireTimeOut then
    Dead;
end;

procedure TFireSprite.DoMove(MoveCount: Integer);
begin
  inherited;
  Collision;
end;

procedure TFormMain.FormDestroy(Sender: TObject);
begin
  TileList.free;
  PlayerList.Free;
end;

procedure TFormMain.InitSysCursor;
begin
  if gameState = gsMain then
    DXDraw.Cursor := crNone
  else
    DXDraw.Cursor := crDefault;
  CursorSprite := TCursorSprite.Create(DXSpriteEngine.Engine);
  CursorSprite.Image := DXImageList.Items.Find('cursor');
  CursorSprite.Z := 9999;

end;

{ TGoodsSprite }

constructor TGoodsSprite.Create(AParent: TSprite);
begin
  inherited Create(AParent);
  Image := FormMain.DXImageList.Items.Find('goods');
  Width := Image.Width;
  Height := Image.Height;
  Randomize;
  AddWhat := Max(Abs(Random(4)), 1);
  Self.AnimCount := 2;
  moveTimeOut := getTickCount;
  case AddWhat of
    1: Self.AnimStart := 0;
    2: Self.AnimStart := 6;
    3: Self.AnimStart := 8;
  end;
  Self.AnimSpeed := 40 / 1000;
  Self.AnimLooped := TRUE;
end;

procedure TGoodsSprite.DoCollision(Sprite: TSprite; var Done: Boolean);
begin
  inherited;
  if (Sprite is TPlayerSprite) then
  begin
    case AddWhat of
      1:
        begin
          (Sprite as TPlayerSprite).MaxBombCount := (Sprite as
            TPlayerSprite).MaxBombCount + 1;
        end;
      2:
        begin
          (Sprite as TPlayerSprite).Power := (Sprite as TPlayerSprite).Power +
            1;
        end;
      3:
        begin
          (Sprite as TPlayerSprite).Speed := (Sprite as TPlayerSprite).Speed +
            500;
        end;
    end;
    if AddWhat in [1, 2, 3] then
    begin
      (Sprite as TPlayerSprite).Exp := (Sprite as TPlayerSprite).Exp + 1;
      (Sprite as TPlayerSprite).HP := (Sprite as TPlayerSprite).HP + AddWhat;
    end;
    Dead;
  end;
end;

procedure TGoodsSprite.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);

  if ((GetTickCount - moveTimeOut) > 800) then
  begin
    if MoveTo then
    begin
      Image.Draw(Engine.Surface, r.Left, r.Top - 3, ImageIndex);
      MoveTo := not MoveTo;
    end
    else
    begin
      Image.Draw(Engine.Surface, r.Left, r.Top + 3, ImageIndex);
      MoveTo := not MoveTo;
    end;
    moveTimeOut := GetTickCount;
  end
  else
    Image.Draw(Engine.Surface, r.Left, r.Top, ImageIndex);
end;

procedure TGoodsSprite.DoMove(MoveCount: Integer);
begin
  inherited;
  Collision;
end;

procedure TFormMain.InitUI;
begin
  edit1.Visible := gamestate = gslogin;
  edit2.Visible := gamestate = gslogin;
  ComboBox1.visible := gamestate = gslogin;
  if GameState = gsMain then
  begin
    FExitButton := TButtonSprite.Create(DXSpriteEngine.Engine);
    with FExitButton do
    begin
      ObjName := 'exit';
      Image := DxImageList.Items.Find('button');
      Width := Image.Width;
      Height := Image.Height;
      AnimCount := 4;
      AnimLooped := false;
      AnimSpeed := 0;
      AnimStart := 2;
      X := 660;
      Y := 555;
      z := 999;
    end;

  end;

  if GameState = gsLogin then
  begin

  end;
end;

procedure TFormMain.DXDrawMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  bsR               : TRect;
  Pt                : TPoint;
begin
  if GameState = gsMain then
  begin
    BsR :=
      Rect(
      Trunc(FExitButton.X),
      Trunc(FExitButton.Y),
      Trunc(FExitButton.x) + FExitButton.Width,
      Trunc(FExitButton.y) + FExitButton.Height
      );

    Pt.X := X;
    Pt.Y := y;
    if PtInRect(BsR, Pt) then
      Self.Close;
  end;

  if GameState = gsLogin then
  begin
    BsR :=
      Rect(
      Trunc(580),
      Trunc(440),
      Trunc(580) + 80,
      Trunc(440) + 80
      );

    Pt.X := X;
    Pt.Y := y;
    if PtInRect(BsR, Pt) then
    begin
      if edit1.Text = '' then
      begin
        Application.MessageBox('请输入《玩家一》的姓名', '提示', mb_ok or
          mb_IconInformation);
        if edit1.CanFocus then
          Edit1.SetFocus;
        Edit1.SelectAll;
        exit;
      end;
      if edit2.Text = '' then
      begin
        Application.MessageBox('请输入《玩家二》的姓名', '提示', mb_ok or
          mb_IconInformation);
        if edit2.CanFocus then
          Edit2.SetFocus;
        Edit2.SelectAll;
        exit;
      end;
      gameState := gsMain;

      Self.InitSysCursor;
      Self.InitMap(ComBoBox1.Items.Strings[ComboBox1.ItemIndex] + '.map');
      Self.InitMapTile;
      Self.InitPlayer;
      Self.InitUI;

    end;

  end;
end;

procedure TFormMain.StartGame(lagcount: Integer);
begin
  if GameState <> gsMain then
  begin
    GameState := gsMain;
    Exit;
  end;
  if GameState = gsMain then
  begin
    DXImageList.Items.Find('Frame').Draw(DXDraw.Surface, 0, 0, 0);
    //  UpdateMapView(LagCount);

    DXSpriteEngine.Move(lagcount);
    DxSpriteEngine.Draw;
    DxSpriteEngine.Dead;

    with DXDraw.Surface.Canvas do
    begin
      Brush.Style := bsClear;
      Font := FormMain.Font;
      Font.Color := clWhite;
      Textout(150, 2, 'FPS: ' + inttostr(DXTimer.FrameRate) +
        ' ESC 退出 ALT+ENTER 全屏幕/窗口切换');
      Textout(150, 15, 'P1按键: 上(R) 下(F) 左(D) 右(G) 放雷(A)' +
        '  P2按键: 上(↑) 下(↓) 左(←) 右(→) 放雷(/)');
      Textout(50, 577, 'chinasf@hotmail.com');
      textOut(300, 577, 'By Delphi 7 and DelphiX');
      Release;
    end;

    with DXDraw.Surface.Canvas do
    begin
      Brush.Style := bsClear;
      Font := FormMain.Font;
      Font.Color := clBlue;
      Pen.Width := 1;
      Pen.Color := clBlack;
      Rectangle(Trunc(Player1.Face.X - 1), Trunc(Player1.Face.Y - 11),
        Trunc(Player1.Face.X + Player1.HP * 2 + 1), Trunc(Player1.Face.Y - 11 +
        4));
      Pen.Color := clRed;
      Rectangle(Trunc(Player1.Face.X), Trunc(Player1.Face.Y - 10),
        Trunc(Player1.Face.X + Player1.HP * 2), Trunc(Player1.Face.Y - 10 + 2));
      Textout(Trunc(Player1.Face.X), Trunc(Player1.Face.Y - 9 - 13),
        'HP:' + Inttostr(Player1.HP));
      Release;
    end;

    with DXDraw.Surface.Canvas do
    begin
      Brush.Style := bsClear;
      Font := FormMain.Font;
      Font.Color := clBlue;
      Pen.Width := 1;
      Pen.Color := clBlack;
      Rectangle(Trunc(Player2.Face.X - 1), Trunc(Player2.Face.Y - 11),
        Trunc(Player2.Face.X + Player2.HP * 2 + 1), Trunc(Player2.Face.Y - 11 +
        4));
      Pen.Color := clRed;
      Rectangle(Trunc(Player2.Face.X), Trunc(Player2.Face.Y - 10),
        Trunc(Player2.Face.X + Player2.HP * 2), Trunc(Player2.Face.Y - 10 + 2));
      Textout(Trunc(Player2.Face.X), Trunc(Player2.Face.Y - 9 - 13),
        'HP:' + Inttostr(Player2.HP));
      Release;
    end;

  end;
end;

procedure TFormMain.InitGameMapList;
var
  fpath             : string;
  fs                : TsearchRec;
begin
  ComboBox1.items.Clear;
  fpath := ExtractFilePath(ParamStr(0)) + 'Map\*.map';
  if findfirst(fpath, faAnyFile, fs) = 0 then
  begin
    if (fs.Name <> '.') and (fs.Name <> '..') then
      if (fs.Attr and faDirectory) = faDirectory then
      else
        comboBox1.Items.Add(ChangeFileExt(ExtractFileName(fs.Name), ''));
    while findnext(fs) = 0 do
    begin
      if (fs.Name <> '.') and (fs.Name <> '..') then
        if (fs.Attr and faDirectory) = faDirectory then
        else
          comboBox1.Items.Add(ChangeFileExt(ExtractFileName(fs.Name), ''));
    end;
  end;
  findclose(fs);
  if ComboBox1.Items.Count > 0 then
    ComboBox1.itemINdex := 0;

end;

end.

⌨️ 快捷键说明

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