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

📄 unit1.~pas

📁 类似超级玛丽模型之二(DELPHIX)
💻 ~PAS
📖 第 1 页 / 共 4 页
字号:
      Begin
//  mainform.dxsfx1.items[0].play(false);
        PlaySoundFX(xx, yy, 0);
        ay := -11 - abs(vx) * 0.3;
        vy := 0;
      End Else If vy > -4 Then
      Begin
        aa := isblock(trunc(xx + 16), trunc(yy + 16));
        If (-aa >= 5 * 16) And (-aa < 8 * 16) Then
        Begin
          ay := -1;
        End Else
          If length(tag) = 3 Then
            If (tag[1] + tag[2] = 'H0') Then
            Begin
              ay := -0.8;
            End;
      End;

  If Not (isButton1 In dxistates) Then game.fireup := true;

  If (isButton1 In dxistates) And (game.nextfire <= 0) And game.fireup Then
    With game.objs[PlayerObj] Do
      If (length(tag) = 3) Then
        If tag[1] + tag[2] = 'H2' Then
          With game.objs[gethandle] Do
          Begin
            If game.objs[playerobj].direction <> 0 Then
              xx := game.objs[PlayerObj].xx - 32 Else xx := game.objs[PlayerObj].xx + 32;
            xx := xx + game.objs[PlayerObj].vx;
            yy := game.objs[PlayerObj].yy - 16;
            If isblock(trunc(xx), trunc(yy + 30)) > 0 Then typo := 0 Else
            Begin
              direction := game.objs[PlayerObj].direction;
              pic := 18;
              pushable := true;
              pusher := false;

              If isup In dxistates Then vy := -10 Else
                If isdown In dxistates Then vy := 5 Else vy := -1;

              ay := 0;
              ax := 0;
              vx := 0;
              typo := 30;
              stall := 255;
              game.fireup := false;
              game.nextfire := 20;
              PlaySoundFX(xx, yy, 6);
            End;
          End;

  If (isUp In dxistates) Then
    With game.objs[PlayerObj] Do
      If (length(tag) = 3) Then
        If (tag[1] + tag[2] = 'H0') Then
          tag[3] := inttostr((strtoint(tag[3]) + 1) Mod 4)[1];

  If (isDown In dxistates) And (game.objs[playerobj].vy >= 0) Then
    With game.objs[playerobj] Do
    Begin
      moveobject(playerobj, 0, abs(vx), 1);
      If isblock(round(xx) + 16, ceil(yy) + 32) > 0 Then
        For aa := 1 To 5 Do
          If isblock(round(xx) + 16 + aa, round(yy) + 32) = -1 Then
          Begin
            direction := 0;
            ax := 0.5;
//      ay:=2;
            slide := true;
            pic := 7;
            break;
          End Else
            If isblock(round(xx) + 16 - aa, round(yy) + 32) = -1 Then
            Begin
              slide := true;
              direction := 1;
              ax := -0.5;
//      ay:=2;
              pic := 7;
              break;
            End;
    End;

  With game.objs[playerobj] Do
    If (isdown In dxistates) And (Not crashx) And (abs(vx) > 2) Then pic := 7; {}
End;


Procedure TMainForm.PlayGame;
Var d               : single;
  s                 : tdxinputstates;
  scorestr          : String;
Begin

  With game.gamma Do
  Begin
    r := 1 - (1 - r) * 0.95;
    g := 1 - (1 - g) * 0.95;
    b := 1 - (1 - b) * 0.95;
  End;

  mainform.updategamma;

  If Not mainform.dxdraw1.candraw Then exit;

// bakgrunn

  If (game.nextfire >= 0) Then dec(game.nextfire);

  mainform.dxinput1.Update;


  If (isbutton1 In mainform.dxinput1.States) Then
    If game.objs[myhandle].typo <> 1 Then
    Begin
      With game Do score := levelscore;
      loadlevel(game.level.currentfile);
    End;



// daah
  s := mainform.dxinput1.states;
  If Not (isup In s) And (mainform.dxinput1.keyboard.keys[17]) Then s := s + [isup];
  If Not (isButton1 In s) And (mainform.dxinput1.keyboard.keys[18]) Then s := s + [isButton1]; {}

// inc(mainform.dxinput1.states.isfire);

  PlayerInput(myhandle, s);

  d := 0.90;
  game.scrollx := round(game.scrollx * d + (game.objs[myhandle].xx - mainform.dxdraw1.display.Width / 2) * (1 - d));
  game.scrolly := round(game.scrolly * d + (game.objs[myhandle].yy - mainform.dxdraw1.display.height / 2) * (1 - d));

{if game.scrollx>game.objs[myhandle].xx-320 then dec(game.scrollvx);
if game.scrollx<game.objs[myhandle].xx-320 then inc(game.scrollvx);
if abs(game.scrollvx)>5 then game.scrollvx:=5*(game.scrollvx div abs(game.scrollvx));

game.scrollx:=game.scrollx+game.scrollvx;

//if game.scrolly>game.objs[myhandle].yy-320 then game.scrollvy:=-1;
//if game.scrolly<game.objs[myhandle].yy-320 then game.scrollvy:=1;
//game.scrolly:=game.scrolly+game.scrollvy;}



  If game.scrolly < 0 Then game.scrolly := 0;
  If game.scrolly > game.level.info.height * 32 - mainform.dxdraw1.display.height Then game.scrolly := game.level.info.height * 32 - mainform.dxdraw1.display.height;
  If game.scrollx < 0 Then game.scrollx := 0;
  If game.scrollx > game.level.info.width * 32 - mainform.dxdraw1.display.width Then game.scrollx := game.level.info.width * 32 - mainform.dxdraw1.display.width;


  With game.objs[myhandle] Do
    If isbutton2 In s Then
    Begin
      ax := ax * 1.75;
//  ax:=ax*1.5;
    End;

  processobjs;

  If slide Then
    With game.objs[myhandle] Do
    Begin
// vy:=vy+0.51;
// MoveObject(myhandle,0,15,0);
    End;

//game.scrollx:=game.objs[myhandle]-160;


  With game Do
  Begin
    BackgroundDraw(round(scrollx / 1.05), round(scrolly / 1.05), 0);
    BackgroundDraw(scrollx, scrolly, 1);
    objdraw;
    BackgroundDraw(round(scrollx * 1.05), round(scrolly * 1.05), 2);
    With dxdraw1.surface.canvas Do
    Begin
      font.name := 'Arial';
      font.size := 8;
      font.style := [fsbold];
      visiblescore := round(visiblescore * 9 / 10 + score / 10);
      scorestr := ' ' + inttostr(visiblescore) + ' ';
      If visiblescore > 0 Then
        textout(630 - textwidth(scorestr), 10, scorestr);
      release;
    End;
  End;



{with mainform.dxdraw1.surface.canvas do
 begin
// textout(0,0,'LECSJDO');

 textout(0,0,inttostr(mainform.dxtimer1.framerate));
//  textout(0,20,inttostr((mainform.dximagelist1.items[4].Picture.Bitmap.Canvas.Pixels[top,left])));
 release;
 end;{}
  mainform.dxdraw1.flip;
  inc(frame);
End;

Procedure TMainForm.LoadWorld(dff: String);
Begin
  game.level.filename := dff;
  loadlevel(dff);
End;



Procedure tmainform.loadgfx;
Var xx              : integer;
Begin
  If fileexists('gfx\' + game.level.info.background) Then
  Begin
    mainform.dximagelist1.items[0].Picture.LoadFromFile('gfx\' + game.level.info.background);
    mainform.dximagelist1.items[1].Picture.LoadFromFile('gfx\' + game.level.info.backobjs);
    mainform.dximagelist1.items[2].Picture.LoadFromFile('gfx\' + game.level.info.sprites);
    mainform.dximagelist1.items[3].Picture.LoadFromFile('gfx\' + game.level.info.sprites);
  End Else
  Begin                                 //internett zip-fix   s
    mainform.dximagelist1.items[0].Picture.LoadFromFile(extractfilepath(application.exename) + game.level.info.background);
    mainform.dximagelist1.items[1].Picture.LoadFromFile(extractfilepath(application.exename) + game.level.info.backobjs);
    mainform.dximagelist1.items[2].Picture.LoadFromFile(extractfilepath(application.exename) + game.level.info.sprites);
    mainform.dximagelist1.items[3].Picture.LoadFromFile(extractfilepath(application.exename) + game.level.info.sprites);
  End;
  calcbmask(1);
  If dxdraw1.display.BitCount = 8 Then
  Begin
    fiximg8(0);
    fiximg8(1);
    fiximg8(2);
  End;


  If (dxdraw1.display.BitCount = 16) Or (dxdraw1.display.bitcount = 15) Then
  Begin
    fiximg16(0);
    fiximg16(1);
    fiximg16(2);
    fiximg16(4);
  End;

  flipimg(2, 3);

  For xx := 0 To 3 Do
  Begin
    mainform.dximagelist1.Items[xx].picture.Bitmap.PixelFormat := pf24bit;
    mainform.DXImageList1.Items[Xx].restore;
  End;
End;



Procedure tmainform.loadlevel(levelfilename: String);
Var filehandle, l, handl, dy, xx, yy: integer;
  a                 : tcollectionitem;
  filename, tag     : String;
Begin
  If myhandle < length(game.objs) Then tag := game.objs[myhandle].tag;

  game.levelscore := game.score;
  visiblescore := game.score;
  With game.gamma Do
  Begin
    r := 0;
    g := 0;
    b := 0;
  End;
  resetlevel;
  resetobjs;                            {}
  If fileexists('l\' + levelfilename + '.l') Then
    filename := 'l\' + levelfilename + '.l' Else
    filename := levelfilename + '.l';

  game.level.currentfile := levelfilename;

  If Not fileexists(filename) Then
  Begin
    menuform.quit.click;
    showmessage('404! file not found!' + filename);
    Exit;
  End;

  game.level.info.startx := 0;
  game.level.info.starty := 0;

  randomize;
  setlength(game.objs, 0);

//load(dff);

  filehandle := fileopen(filename, fmOpenRead);
  If filehandle < 0 Then Begin;
    messagedlg('Couldn''t open level file:' + filename, mtError, [mbAbort], 0);
    exit;
  End;
//assignfile(ff,f);
//reset(ff,1);

//blockread(ff,game.level.info,sizeof(levelextrainfotype));
  fileread(filehandle, game.level.info, sizeof(levelextrainfotype));

  With game.level Do setlength(l, info.layers, info.width, info.height);
  For l := 0 To game.level.info.layers - 1 Do
    For dy := 0 To game.level.info.width - 1 Do
      fileread(filehandle, game.level.l[l][dy, 0], (game.level.info.height * 2));
//     blockread(ff,game.level.l[l][dy,0],(game.level.info.height*2));

  fileclose(filehandle);


//closefile(ff);{}

  For yy := 0 To game.level.info.height - 1 Do
    For xx := 0 To game.level.info.width - 1 Do
      With game.level Do
      Begin
        If (l[GameLayer][xx, yy] >= 8) And (l[GameLayer][xx, yy] <= 15) Then l[GameLayer][xx, yy] := -l[GameLayer][xx, yy];
        If (l[GameLayer][xx, yy] >= 5 * 16) And (l[GameLayer][xx, yy] < 8 * 16) Then
        Begin
          l[GameLayer][xx, yy] := -l[GameLayer][xx, yy];
        End;
        If CreateObjectofBlock(l[gamelayer][xx, yy], xx Shl 5, yy Shl 5) <> -1 Then l[gamelayer][xx, yy] := -1;
        If CreateObjectofBlock(l[2][xx, yy], xx Shl 5, yy Shl 5) <> -1 Then l[2][xx, yy] := -1;
      End;
//------------------------------------------------------------
  myhandle := gethandle;
  game.objs[myhandle].pic := 0;
  game.objs[myhandle].typo := 1;
  game.objs[myhandle].stall := 250;
  game.objs[myhandle].pushable := true;
  game.objs[myhandle].pusher := true;
  game.objs[myhandle].xx := game.level.info.startx;
  game.objs[myhandle].yy := game.level.info.starty;
//showmessage('back;'+game.level.info.background);
//mainform.dximagelist1.Items.restore;
  loadgfx;

  game.scrollx := game.level.info.startx - 320;
  game.scrolly := game.level.info.starty - 240;
  game.objs[myhandle].tag := tag;

  mainform.DXSound1.Restore;
{if fileexists('mfx\itf.wav') then
 begin
 a:=mainform.dxmusic1.Items.Add;
 mainform.dxmusic1.Items.Items[a.Index].wave.loadfromfile('mfx\itf.wav');
 mainform.dxmusic1.items.items[a.index].Restore;
// mainform.dxmusic1.Items.Items[a.index].Buffer.LoadFromWave(mainform.dxmusic1.Items.Items[a.Index].wave);
 mainform.dxmusic1.Items.Items[a.index].looped:=true;
 mainform.dxmusic1.items.items[a.index].play(false);
 end;{}
End;

//type atype = array[0..32*32*4] of byte;

Procedure TMainForm.InitGame;
Begin
  game.score := 0;
  initsnow;
  loadworld('openland');
  playing := true;
End;

Procedure TMainForm.InitApp;
Var a               : String;
Begin
{mainform.top:=0;
mainform.left:=0;{}
//screen.cursor:=crnone;
//      DXDraw1.Cursor := crNone;

  mainform.clientwidth := 640;
  mainform.clientheight := 480;


  flipimg(1, 2);
  dximagelist1.items.Restore;
End;


Procedure ShowIntro;
Begin
  mainform.dximagelist1.items[4].draw(mainform.dxdraw1.surface, 0, 0, 0);
  mainform.dxdraw1.flip;
//
{
if introframe=0 then
 if fileexists('mfx\joffatun.wav') then
  begin
  mainform.dxmusic1.Items.Clear;
//  a:=mainform.dxmusic1.Items.Add;
  with mainform.dxmusic1.Items.Items[mainform.dxmusic1.Items.Add.Index] do
   begin
   wave.loadfromfile('mfx\joffatun.wav');
//   wave.SetPCMFormat(44100,16,2);
   Restore;
   looped:=true;
   play(true);
//   mainform.dxsound1.
   end;
  end;{}

  inc(introframe);
End;

Procedure TMainForm.DXTimer1Timer(Sender: TObject; LagCount: Integer);
Begin
  dxinput1.Keyboard.Update;
{if dxinput1.Keyboard.Keys[0] then
 begin

 end;{}
  If playing Then playgame;
  If Not playing Then showintro Else introframe := 0;
End;

Procedure TMainForm.DXPlay1Message(Sender: TObject; From: TDXPlayPlayer;
  Data: Pointer; DataSize: Integer);
Var i               : integer;
Begin
  For i := 0 To maxplayers - 1 Do
    If game.players[i].id = from.ID Then
    Begin

    End;
End;

Procedure TMainForm.FormKeyDown(Sender: TObject; Var Key: Word;
  Shift: TShiftState);
Begin
  If key = VK_ESCAPE Then
  Begin
    MenuForm.Left := Left + (Width - MenuForm.Width) Div 2;
    MenuForm.Top := Top + (Height - MenuForm.Height) Div 2;
    MenuForm.ShowModal;
  End;
  If key = VK_F4 Then debugform.show;

  If (ssAlt In Shift) And (Key = VK_RETURN) Then SwitchMode;
End;

Procedure TMainForm.DXDraw1InitializeSurface(Sender: TObject);
Begin
  If dofullscreen In mainform.dxdraw1.Options Then
  Begin
    mainform.BorderStyle := bsnone;
  End Else mainform.borderstyle := bssingle; {}
End;

Procedure TMainForm.FormKeyUp(Sender: TObject; Var Key: Word;
  Shift: TShiftState);
Begin
  If key = VK_F4 Then debugform.hide;
End;

Procedure TMainForm.FormCreate(Sender: TObject);
Begin
  Filemode := fmOpenRead;
End;

Procedure TMainForm.DXDraw1Click(Sender: TObject);
Begin
  If Not playing Then
End;

End.

⌨️ 快捷键说明

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