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

📄 editorunit1.pas

📁 一个用delphi编写的过关游戏
💻 PAS
📖 第 1 页 / 共 2 页
字号:
  If fileexists('gfx\klosser.bmp') Then
  Begin
    Pbmp.items[1].Picture.loadfromfile('gfx\klosser.bmp');
    Kbmp.items[1].Picture.loadfromfile('gfx\klosser.bmp');
  End Else
  Begin
    Pbmp.items[1].Picture.loadfromfile('klosser.bmp');
    Kbmp.items[1].Picture.loadfromfile('klosser.bmp');
  End;
  PBMP.Items.Restore;
  KBMP.Items.Restore;
  refreshklosser;
End;


Procedure save(f: String);
Var ff              : File;
  dy, l             : integer;
Begin
  If fileexists(f) Then deletefile(f);
  assign(ff, f);
  rewrite(ff, 1);
  blockwrite(ff, game.level.info, sizeof(levelextrainfotype));
  For l := 0 To game.level.info.layers - 1 Do
    For dy := 0 To game.level.info.width - 1 Do
      blockwrite(ff, game.level.l[l][dy, 0], (game.level.info.height * 2));
  close(ff);
End;



Procedure teditorform.load(f: String);
Var ff              : File;
  l, dy, a          : integer;
Begin
  resetlevel;
  assignfile(ff, f);
  reset(ff, 1);
  blockread(ff, game.level.info, sizeof(levelextrainfotype));
  self.layers.items.Clear;
  For a := 0 To game.level.info.layers - 1 Do
  Begin
    self.layers.items.add(inttostr(a));
// self.layers.checked[a]:=true;
  End;
//self.Layers.
  For a := 0 To game.level.info.layers - 1 Do
  Begin
    self.layers.checked[a] := true;
  End;
  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
      blockread(ff, game.level.l[l][dy, 0], (game.level.info.height * 2));
  closefile(ff);
End;


Procedure TEditorForm.PreviewMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
Begin
  If ssShift In shift Then
  Begin
    fromlevel.Checked := true;
    draw := 3;
    selstarttemp := point(x Div 32 + scrollx.position, y Div 32 + scrolly.position);
  End Else
    Case Button Of
      mbLeft: draw := 1;
      mbRight: draw := 2;
    End;

  PreviewMouseMove(Sender, [], x, y);
End;

Procedure TEditorForm.PreviewMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
Begin
  draw := 0;
  sellayer := currentlayer;
End;

Procedure TEditorForm.RefreshKlosser;
Var xx, yy, kloss   : integer;
Begin
  klosser.surface.Fill(clwhite);
  kloss := klosser.width Div 32 * KlosserScroll.Position;
  For yy := 0 To (klosser.height Div 32) - 1 Do
    For xx := 0 To (klosser.width Div 32) - 1 Do
      If kloss < Kbmp.items[1].PatternCount Then
      Begin
        Kbmp.Items[1].Draw(klosser.surface, xx * 32, yy * 32, kloss);
        If frombitmap.checked Then
          If (selstart.x <= xx) And (selend.x >= xx) And
            (selstart.y <= yy + klosserscroll.position) And (selend.y >= yy + klosserscroll.position) Then
            Kbmp.Items[2].Draw(klosser.surface, xx * 32, yy * 32, 0);

        inc(kloss);
      End Else break;
//klosser.surface.Canvas.Rectangle(selstart.x*32,selstart.y*32,selend.x*32+31,selend.y*32+31);
//drawbox(selstart,selend);
// for xx:=1 to 31 do
//
// with preview.surface.Pixels[xx,yy] .Canvas do
//  begin
//  Brush.Style := bsClear;
//  Rectangle(32,32,31+32,31+32);
//  Release;
//  end;
  KlosserScroll.Visible := (kbmp.items[1].patterncount) > (klosser.height Div 32) * (klosser.width Div 32);
  KlosserScroll.Max := (kbmp.items[1].patterncount) Div (klosser.width Div 32);
  If Not KlosserScroll.visible Then klosserscroll.Position := 0;
  klosser.Flip;
End;

Procedure TEditorForm.Splitter1Moved(Sender: TObject);
Begin
  refreshklosser;
End;

Var marking         : boolean = false;
  levelmarking      : boolean = false;

Procedure TEditorForm.KlosserMouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
Begin
  frombitmap.checked := true;
  selstarttemp := point(x Div 32, (y) Div 32 + klosserscroll.position);
  marking := true;
  KlosserMouseMove(Sender, [], x, y);
End;

Procedure TEditorForm.KlosserMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
Begin
  marking := false;
End;

Procedure TEditorForm.PreviewMouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
Var xx, yy          : integer;
Begin
  If (x < 0) Or (y < 0) Or (x > preview.width) Or (y > preview.height) Then exit;
  cursor.x := x Div 32;
  cursor.y := y Div 32;

  If draw = 3 Then
  Begin
    selstart := selstarttemp;
    SelEnd := Point(x Div 32 + scrollx.position, y Div 32 + scrolly.position);
    If selend.x < selstart.x Then swap(selend.x, selstart.x);
    If selend.y < selstart.y Then swap(selend.Y, selstart.y);
// RefreshKlosser;
  End Else
    If fromlevel.checked Then
    Begin
      If selend.x >= game.level.info.width Then selend.x := game.level.info.width - 1;
      If selend.y >= game.level.info.height Then selend.y := game.level.info.height - 1;
      If selstart.x >= game.level.info.width Then selstart.x := game.level.info.width - 1;
      If selstart.y >= game.level.info.height Then selstart.y := game.level.info.height - 1;
    End;

  If draw = 1 Then
    If frombitmap.checked Then
    Begin
      For xx := 0 To (selend.x - selstart.x) Do
        For yy := 0 To (selend.y - selstart.y) Do
          If ((cursor.x + xx + game.scrollx Div 32) < game.level.info.width) And
            ((cursor.y + yy + game.scrolly Div 32) < game.level.info.height) Then
            game.level.l[currentlayer][cursor.x + xx + game.scrollx Div 32, cursor.y + yy + game.scrolly Div 32] :=
              (klosser.width Div 32) * (selstart.y + yy) + selstart.x + xx;
    End Else
    Begin
      For xx := 0 To (selend.x - selstart.x) Do
        For yy := 0 To (selend.y - selstart.y) Do
          If ((cursor.x + xx + game.scrollx Div 32) < game.level.info.width) And
            ((cursor.y + yy + game.scrolly Div 32) < game.level.info.height) Then
            game.level.l[currentlayer][cursor.x + xx + game.scrollx Div 32, cursor.y + yy + game.scrolly Div 32] :=
              game.level.l[sellayer][xx + selstart.x, yy + selstart.y];
    End;

  If draw = 2 Then
    For xx := 0 To (selend.x - selstart.x) Do
      For yy := 0 To (selend.y - selstart.y) Do
        If ((cursor.x + xx + game.scrollx Div 32) < game.level.info.width) And
          ((cursor.y + yy + game.scrolly Div 32) < game.level.info.height) Then
          game.level.l[currentlayer][cursor.x + xx + game.scrollx Div 32, cursor.y + yy + game.scrolly Div 32] := -1;

End;

Procedure TEditorForm.KlosserMouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
Begin
  If marking Then
  Begin
    selstart := selstarttemp;
    SelEnd := Point(x Div 32, y Div 32 + klosserscroll.position);
    If selend.x < selstart.x Then swap(selend.x, selstart.x);
    If selend.y < selstart.y Then swap(selend.Y, selstart.y);
    RefreshKlosser;
  End;
End;

Procedure TEditorForm.KlosserScrollChange(Sender: TObject);
Begin
  refreshklosser;
End;

Procedure TEditorForm.FormShow(Sender: TObject);
Begin
  refreshklosser;
End;

Procedure TEditorForm.LayersClick(Sender: TObject);
Begin
  With layers Do currentlayer := strtoint(Items[ItemIndex]);
End;

Procedure TEditorForm.FromlevelClick(Sender: TObject);
Begin
  If sender.ClassType = tmenuitem Then
    tmenuitem(sender).checked := true;
  refreshklosser;
  selstart := point(0, 0);
  selend := point(0, 0);
End;

Procedure TEditorForm.ScrollyChange(Sender: TObject);
Begin
  If scrolly.max <> game.level.info.height Then scrolly.max := game.level.info.height;
End;

Procedure TEditorForm.ScrollxChange(Sender: TObject);
Begin
  If scrollx.max <> game.level.info.width Then scrollx.max := game.level.info.width;
End;

Procedure TEditorForm.ActionLoadLevelExecute(Sender: TObject);
Begin
  If opendialog1.Execute = true Then
  Begin
    load(opendialog1.filename);
    With settingsform Do
    Begin
      edit1.text := inttostr(game.level.info.width);
      edit2.text := inttostr(game.level.info.height);
      edit3.text := game.level.info.name;
      combobox2.text := game.level.info.background;
      combobox3.Text := game.level.info.backobjs;
      combobox1.text := game.level.info.sprites;
      edit4.text := inttostr(game.level.info.scrollbackground);
      layers.Position := game.level.info.layers;
    End;
    initbmp;
    opendialog1.initialdir := extractfilepath(opendialog1.filename);
    savedialog1.filename := opendialog1.filename;
  End;
End;

Procedure TEditorForm.ActionSaveLevelExecute(Sender: TObject);
Begin
  If savedialog1.Execute = true Then
  Begin
    save(savedialog1.filename);
    savedialog1.initialdir := extractfilepath(savedialog1.filename);
    opendialog1.FileName := savedialog1.filename;
  End;
End;

Procedure TEditorForm.ActionOptionExecute(Sender: TObject);
Var a, c, ll, xx, yy: integer;
Begin
  With settingsform Do
    If showmodal = mrok Then
      With game.level Do
      Begin
        info.layers := layers.position;
        If self.layers.items.count <> info.layers Then
        Begin
          self.layers.items.Clear;
          For a := 0 To info.layers - 1 Do
          Begin
            self.layers.items.add(inttostr(a));
            self.layers.checked[a] := true;
          End;
        End;

        val(edit1.text, a, c);
        info.width := a;

        val(edit2.text, a, c);
        info.height := a;

        info.name := edit3.text;
        info.sprites := combobox1.Text;
        info.background := combobox2.Text;
        info.backobjs := combobox3.Text;
        info.megaobjs := combobox4.Text;
        info.bypass := combobox5.Text;
        setlength(l, info.layers, info.width, info.height);

        For ll := 0 To info.layers - 1 Do
          For xx := 0 To info.width - 1 Do
            For yy := 0 To info.height - 1 Do
              If l[ll][xx, yy] = 0 Then l[ll][xx, yy] := -1;

        val(edit4.text, a, c);
        info.scrollbackground := a;
        initbmp;

        Scrollx.Max := game.level.info.height;
        Scrolly.Max := game.level.info.width;
      End;
End;

procedure TEditorForm.ActionExitExecute(Sender: TObject);
begin
  Close;
end;

procedure TEditorForm.ActionResetLevelExecute(Sender: TObject);
begin
  If application.messagebox('Vil du t鴐me brettet?', '', mb_yesno) = mryes Then
    resetlevel;
end;

procedure TEditorForm.ActionShowHintsExecute(Sender: TObject);
begin
  Layers.ShowHint:=Hints1.Checked;
  Preview.ShowHint:=Hints1.Checked;
  Klosser.ShowHint:=Hints1.Checked;
end;

procedure TEditorForm.ActionRunLevelExecute(Sender: TObject);
begin
  chdir(extractfilepath(application.exename));
  DeleteFile('j32temp.l');
  If Not fileexists('j32temp.l') Then
  Begin
    Save('j32temp.l');
    WinExec('joffa.exe j32temp.l', sw_show);
  End;
end;

End.

⌨️ 快捷键说明

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