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

📄 players.pas

📁 dos下经典游戏超级马力的完整源代码
💻 PAS
字号:
unit Players;

interface

  uses
    TmpObj,
    Blocks,
    Buffers,
    Figures,
    Glitter,
    Enemies,
    BackGr,
    VGA256,
    Music,
    Txt,
    KeyBoard,
    Joystick,
    Crt;

  const
    stOnTheGround = 0;
    stJumping     = 1;
    stFalling     = 2;

    SCROLL_AT     = 112;

    JumpVel       = 4;
    JumpDelay     = 6;
    MaxYVel       = JumpVel * 2;
    Slip          = 6;
    BlinkTime     = 125;
    StarTime      = 750;
    GrowTime      = 24;

    MAX_SPEED     = 2;

  var
    Blinking,
    Growing,
    InPipe: Boolean;
    PipeCode: array [1 .. 2] of Char;
    MapX,
    MapY: Integer;
    EarthQuake: Boolean;
    EarthQuakeCounter: Integer;
    Small: Integer;

  procedure InitPlayerFigures;
  procedure InitPlayer (InitX, InitY: Integer; Name: Byte);
  procedure DrawPlayer;
  procedure ErasePlayer;
  procedure DoDemo;
  procedure MovePlayer;


implementation

  {$I SWMAR.$00} {$I SWMAR.$01}
  {$I SJMAR.$00} {$I SJMAR.$01}
  {$I LWMAR.$00} {$I LWMAR.$01}
  {$I LJMAR.$00} {$I LJMAR.$01}
  {$I FWMAR.$00} {$I FWMAR.$01}
  {$I FJMAR.$00} {$I FJMAR.$01}

  {$I SWLUI.$00} {$I SWLUI.$01}
  {$I SJLUI.$00} {$I SJLUI.$01}
  {$I LWLUI.$00} {$I LWLUI.$01}
  {$I LJLUI.$00} {$I LJLUI.$01}
  {$I FWLUI.$00} {$I FWLUI.$01}
  {$I FJLUI.$00} {$I FJLUI.$01}

  const
    Safe = EY1;
    HSafe = H * Safe;

  var
    keyLeft,
    keyRight,
    keyUp,
    keyDown,
    keyAlt,
    keyCtrl,
    keyLeftShift,
    keyRightShift,
    keySpace: Boolean;

  type
    ScreenRec = record
      Visible: Boolean;
      XPos,
      YPos: Integer;
  {    Buffer: PicBuffer; }
      BackGrAddr: Word;
    end;

  var
    SaveScreen: Array [0 .. MAX_PAGE] of ScreenRec;

  var
    X,
    Y,
    OldX,
    OldY,
    DemoX,
    DemoY,
    DemoCounter1,
    DemoCounter2,
    XVel,
    YVel: Integer;
    Direction,
    Status,
    WalkingMode,
    Counter,
    WalkCount: Byte;
    HighJump,
    HitEnemy,
    Jumped,
    Fired: Boolean;
    FireCounter,
    StarCounter,
    GrowCounter,
    BlinkCounter: Integer;
    AtCh1,
    AtCh2,
    Below1,
    Below2: Char;


  procedure HighMirror (P1, P2: Pointer);
    type
      PlaneBuffer = array[0..2 * H - 1, 0..W div 4 - 1] of Byte;
      PlaneBufferArray = array[0..3] of PlaneBuffer;
      PlaneBufferArrayPtr = ^PlaneBufferArray;
    var
      Source, Dest: PlaneBufferArrayPtr;
    procedure Swap (Plane1, Plane2: Byte);
      var
        i, j: Byte;
    begin
      for j := 0 to 2 * H - 1 do
        for i := 0 to W div 4 - 1 do
        begin
          Dest^[Plane2, j, i] := Source^[Plane1, j, W div 4 - 1 - i];
          Dest^[Plane1, j, i] := Source^[Plane2, j, W div 4 - 1 - i];
        end;
    end;
  begin
    Source := P1;
    Dest := P2;
    Swap (0, 3);
    Swap (1, 2);
  end;

  procedure InitPlayerFigures;
  var
    Pl, Md, N: Byte;
  begin
    FillChar (Pictures^, SizeOf (Pictures^), #$FF);

    Move (@SWMar000^, Pictures^ [plMario, mdSmall, 0, dirLeft], SizeOf (PicBuffer));
    Move (@SWMar001^, Pictures^ [plMario, mdSmall, 1, dirLeft], SizeOf (PicBuffer));
    Move (@SJMar000^, Pictures^ [plMario, mdSmall, 2, dirLeft], SizeOf (PicBuffer));
    Move (@SJMar001^, Pictures^ [plMario, mdSmall, 3, dirLeft], SizeOf (PicBuffer));

    Move (@LWMar000^, Pictures^ [plMario, mdLarge, 0, dirLeft], SizeOf (PicBuffer));
    Move (@LWMar001^, Pictures^ [plMario, mdLarge, 1, dirLeft], SizeOf (PicBuffer));
    Move (@LJMar000^, Pictures^ [plMario, mdLarge, 2, dirLeft], SizeOf (PicBuffer));
    Move (@LJMar001^, Pictures^ [plMario, mdLarge, 3, dirLeft], SizeOf (PicBuffer));

    Move (@FWMar000^, Pictures^ [plMario, mdFire, 0, dirLeft], SizeOf (PicBuffer));
    Move (@FWMar001^, Pictures^ [plMario, mdFire, 1, dirLeft], SizeOf (PicBuffer));
    Move (@FJMar000^, Pictures^ [plMario, mdFire, 2, dirLeft], SizeOf (PicBuffer));
    Move (@FJMar001^, Pictures^ [plMario, mdFire, 3, dirLeft], SizeOf (PicBuffer));


    Move (@SWLui000^, Pictures^ [plLuigi, mdSmall, 0, dirLeft], SizeOf (PicBuffer));
    Move (@SWLui001^, Pictures^ [plLuigi, mdSmall, 1, dirLeft], SizeOf (PicBuffer));
    Move (@SJLui000^, Pictures^ [plLuigi, mdSmall, 2, dirLeft], SizeOf (PicBuffer));
    Move (@SJLui001^, Pictures^ [plLuigi, mdSmall, 3, dirLeft], SizeOf (PicBuffer));

    Move (@LWLui000^, Pictures^ [plLuigi, mdLarge, 0, dirLeft], SizeOf (PicBuffer));
    Move (@LWLui001^, Pictures^ [plLuigi, mdLarge, 1, dirLeft], SizeOf (PicBuffer));
    Move (@LJLui000^, Pictures^ [plLuigi, mdLarge, 2, dirLeft], SizeOf (PicBuffer));
    Move (@LJLui001^, Pictures^ [plLuigi, mdLarge, 3, dirLeft], SizeOf (PicBuffer));

    Move (@FWLui000^, Pictures^ [plLuigi, mdFire, 0, dirLeft], SizeOf (PicBuffer));
    Move (@FWLui001^, Pictures^ [plLuigi, mdFire, 1, dirLeft], SizeOf (PicBuffer));
    Move (@FJLui000^, Pictures^ [plLuigi, mdFire, 2, dirLeft], SizeOf (PicBuffer));
    Move (@FJLui001^, Pictures^ [plLuigi, mdFire, 3, dirLeft], SizeOf (PicBuffer));

    for Pl := plMario to plLuigi do
      for Md := mdSmall to mdFire do
        for N := 0 to 3 do
          HighMirror (@Pictures^ [Pl, Md, N, dirLeft], @Pictures^ [Pl, Md, N, dirRight]);
  end;

  procedure InitPlayer (InitX, InitY: Integer; Name: Byte);
  var
    i: Integer;
  begin
    Player := Name;
    X := InitX;
    Y := InitY;
    OldX := X;
    OldY := Y;
    XVel := 0;
    YVel := 0;
    Direction := dirRight;
    WalkingMode := 0;
    Status := stOnTheGround;
    Jumped := False;
    Fired := False;
    HitEnemy := False;
    for i := 0 to MAX_PAGE do
      SaveScreen [i]. Visible := False;
    PlayerX1 := X;
    PlayerX2 := X + W - 1;
    PlayerY1 := Y + H;
    PlayerY2 := Y + 2 * H - 1;
    PlayerXVel := XVel;
    PlayerYVel := YVel;
    Blinking := False;
    Star := False;
    Growing := False;
    EarthQuake := False;
  end;

  procedure DrawDemo;
  var
    i, j: Integer;
  begin
    with SaveScreen [CurrentPage] do
    begin
     { GetImage (X, Y, W, 2 * H, Buffer); }
      BackGrAddr := PushBackGr (X, Y, W + 4, 2 * H);
      XPos := X;
      YPos := Y;
      Visible := True;
    end;
    case Demo of
      dmDownInToPipe,
      dmUpOutOfPipe:
        begin
          DrawPart (X, Y + DemoY, W, 2 * H, 0, 2 * H - DemoY - 1,
            Pictures^ [Player, Data.Mode [Player], WalkingMode, Direction]);
        end;
      dmUpInToPipe,
      dmDownOutOfPipe:
        begin
          DrawPart (X, Y + DemoY, W, 2 * H, -DemoY, 2 * H,
            Pictures^ [Player, Data.Mode [Player], WalkingMode, Direction]);
          Redraw (MapX, MapY - 1);
          Redraw (MapX + 1, MapY - 1);
        end;
      dmDead:
        begin
          DrawImage (X, Y, W, 2 * H,
            Pictures^ [Player, Data.Mode [Player], WalkingMode, Direction]);
        end;


    end;
    OldX := X;
    OldY := Y;
  end;

  procedure DrawPlayer;
  begin
    if Demo <> dmNoDemo then
    begin
      DrawDemo;
      Exit;
    end;
    if (not Blinking) or (BlinkCounter mod 2 = 0) then
    begin
      with SaveScreen [CurrentPage] do
      begin
       { GetImage (X, Y, W, 2 * H, Buffer); }
        BackGrAddr := PushBackGr (X, Y, W + 4, 2 * H);
        XPos := X;
        YPos := Y;
        Visible := True;
      end;
      if (Data.Mode [Player] = mdFire) and keySpace and (FireCounter < 7) then
      begin
        Inc (FireCounter);
        DrawPart (X, Y + 1, W, 2 * H, 0, 20,
          Pictures^ [Player, mdFire, 1, Direction]);
        DrawPart (X, Y, W, 2 * H, 21, 2 * H,
          Pictures^ [Player, mdFire, 0, Direction]);
      end
      else
        if Star or Growing then
          RecolorImage (X, Y, W, 2 * H, Pictures^ [Player, Data.Mode [Player],
            WalkingMode, Direction],
            ((GrowCounter + StarCounter) and 1) shl 4 -
             Byte ((GrowCounter + StarCounter) and $F < 8))
        else
          DrawImage (X, Y, W, 2 * H, Pictures^ [Player, Data.Mode [Player], WalkingMode,
            Direction]);
      OldX := X;
      OldY := Y;
    end;
  end;

  procedure ErasePlayer;
  begin
    with SaveScreen [CurrentPage] do
    begin
      if not Visible then
        Exit;
    {  PutImage (XPos, YPos, W, 2 * H, Buffer); }
      PopBackGr ({XPos, YPos, W + 4, 2 * H,} BackGrAddr);
      Visible := False;
    end;
  end;

  procedure DoDemo;
  begin
    Small := 9 * Byte (Data.Mode [Player] in [mdSmall]);
    case Demo of
      dmDownInToPipe,
      dmUpOutOfPipe:
        begin
          if PipeCode [1] = '

⌨️ 快捷键说明

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