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

📄 mainform.common.cs

📁 手机软件开发..手机软件开发..手机软件开发..手机软件开发..
💻 CS
字号:
using System;
using System.Drawing;
using System.Threading;
using System.Collections.Generic;
using System.Windows.Forms;
using Skyiv.Ben.PushBox.Common;

namespace Skyiv.Ben.PushBoxStd.Window
{
  partial class MainForm
  {
    /// <summary>
    /// 装入当前关数据
    /// </summary>
    /// <param name="isReSizeClient">是否根据当前关尺寸改变主窗体客户区尺寸</param>
    void LoadLevel(bool isReSizeClient)
    {
      env.LoadLevel();
      if (isReSizeClient && Environment.OSVersion.Platform != PlatformID.WinCE)
        ClientSize = env.GetClientSize(/*sbrMain.Visible ? sbrMain.Height : 0*/Pub.StatusBarHeight);
      ClientSizeChanged();
      UpdateStatus();
    }

    /// <summary>
    /// 主窗体客户区尺寸改变时要采取的动作
    /// </summary>
    void ClientSizeChanged()
    {
      env.ClientSize = new Size(ClientSize.Width, ClientSize.Height +
        Pub.OverY - (/*sbrMain.Visible ? sbrMain.Height : 0*/Pub.StatusBarHeight));
      env.SetBoxInfo();
      Invalidate();
    }

    /// <summary>
    /// 恢复上次退出时保存的走法
    /// </summary>
    /// <param name="steps">走法</param>
    void Restore(string steps)
    {
      Rectangle invalid;
      foreach (char c in steps)
      {
        Step step = c;
        if (!env.StepIt(step.Direct, step.IsStop, out invalid)) break;
      }
      Invalidate();
      UpdateStatus();
    }

    /// <summary>
    /// 工人往指定方向前进一步(可能推着箱子)
    /// </summary>
    /// <param name="dir">前进的方向</param>
    /// <param name="isStop">“撤销”时是否停留</param>
    void StepIt(Direction dir, bool isStop)
    {
      Rectangle invalid;
      if (!env.StepIt(dir, isStop, out invalid)) return;
      Invalidate(invalid);
      UpdateStatus();
    }

    /// <summary>
    /// 工人后退一步(可能连带箱子一起后退)
    /// </summary>
    /// <returns>是否完成“撤消”</returns>
    bool Back()
    {
      Rectangle invalid;
      bool isStop = env.Back(out invalid);
      Invalidate(invalid);
      UpdateStatus();
      return isStop;
    }

    /// <summary>
    /// 尝试将工人移动到鼠标点击的位置
    /// </summary>
    /// <returns>是否成功</returns>
    bool TryMove()
    {
      Queue<Direction> moveQueue = env.GetMoveInfo();
      if (moveQueue == null) return false;
      if (moveQueue.Count <= 0) return false;
      int count = moveQueue.Count;
      while (moveQueue.Count > 0)
      {
        bool isStop = (count == moveQueue.Count);
        if (!isStop && env.StepDelay > 0) Thread.Sleep(env.StepDelay);
        StepIt(moveQueue.Dequeue(), isStop);
      }
      return true;
    }

    /// <summary>
    /// 尝试将箱子推动到鼠标点击的位置
    /// </summary>
    /// <returns>是否成功</returns>
    bool TryPush()
    {
      Direction dir;
      int steps = env.GetPushInfo(out dir);
      if (steps <= 0) return false;
      for (int i = 0; i < steps; i++)
      {
        bool isStop = (i == 0);
        if (!isStop && env.StepDelay > 0) Thread.Sleep(env.StepDelay);
        StepIt(dir, isStop);
      }
      return true;
    }

    Rectangle GetStatusBarRectangle()
    {
      int height = Pub.StatusBarHeight - 2;
      return new Rectangle(0, ClientSize.Height - height, ClientSize.Width, height);
    }

    /// <summary>
    /// 更新状态栏信息和菜单项
    /// </summary>
    void UpdateStatus()
    {
      // sbrMain.Text = env.StatusMessage;
      miExit.Enabled = !env.IsReplay && !env.IsDesign;
      miSystem.Enabled = !env.IsReplay;
      miOption.Enabled = !env.HasError && !env.IsReplay;
      miSelectLevel.Enabled = !env.IsDesign && !env.HasError && !env.IsReplay && (!env.CanUndo || env.IsFinish);
      miSelectGroup.Enabled = !env.IsDesign && miSelectLevel.Enabled && env.Groups.Length > 1;
      miLastLevel.Enabled = miNextLevel.Enabled = miSelectLevel.Enabled && env.Level < env.MaxLevel - 1;
      miFirstLevel.Enabled = miPrevLevel.Enabled = miSelectLevel.Enabled && env.Level > 0;
      miLastGroup.Enabled = miNextGroup.Enabled = miSelectGroup.Enabled && env.Group < env.Groups.Length - 1;
      miFirstGroup.Enabled = miPrevGroup.Enabled = miSelectGroup.Enabled && env.Group > 0;
      miConfig.Enabled = miTran.Enabled = !env.IsDesign && !env.IsReplay && (!env.CanUndo || env.IsFinish);
      miDesign.Enabled = miSelectLevel.Enabled && !env.CanUndo;
      miRestart.Enabled = miRestartOrStopOrSave.Enabled = miUndoOrStopOrCancel.Enabled = !env.HasError && (env.IsDesign ? (!env.IsReplay && env.HasWorker) : (env.IsReplay || env.CanUndo));
      miUndo.Enabled = miBack.Enabled = miBackOrManOrBox.Enabled = !env.HasError && !env.IsReplay && (env.IsDesign || env.CanUndo);
      miPrevLevel2OrSlot.Enabled = !env.HasError && !env.IsReplay && (env.IsDesign || (miSelectLevel.Enabled && env.Level > 0));
      miNextLevel2OrWall.Enabled = !env.HasError && !env.IsReplay && (env.IsDesign || (miSelectLevel.Enabled && env.Level < env.MaxLevel - 1));
      miRecord.Enabled = miRecordOrBrick.Enabled = !env.HasError && !env.IsReplay && (env.IsDesign || env.IsFinish);
      miReplay.Enabled = miReplayOrLand.Enabled = !env.HasError && !env.IsReplay && (env.IsDesign || env.CanReplay);
      miRestartOrStopOrSave.Text = !env.IsDesign ? (!env.IsReplay ? "〓" : "■") : "保存";
      miUndoOrStopOrCancel.Text = !env.IsDesign ? (!env.IsReplay ? "撤销" : "停止") : "放弃";
      miBackOrManOrBox.Text = !env.IsDesign ? "←" : env.HasWorker ? "箱" : "人";
      miPrevLevel2OrSlot.Text = !env.IsDesign ? "▲" : "槽";
      miNextLevel2OrWall.Text = !env.IsDesign ? "▼" : "墙";
      miRecordOrBrick.Text = !env.IsDesign ? "●" : "砖";
      miReplayOrLand.Text = !env.IsDesign ? "回放" : "地";
      Invalidate(GetStatusBarRectangle());
      Update();
    }
  }
}

⌨️ 快捷键说明

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