【问题标题】:How to simplify stopping movement of image when within threshold of target如何在目标阈值内简化图像的停止移动
【发布时间】:2010-01-16 06:10:49
【问题描述】:

我已经尝试向其他人解释我想要做什么,但失败了。因此,如果您不介意的话,我将向您展示代码并尝试解释一下。

        if (MovePetMoving)
        {
            if (MovePetSlope[0] > 0)
            {
                if (MovePetSlope[1] > 0 && Convert.ToDouble(pictureBoxPet.Location.X) + MovePetSlope[0] <= MovePetTarget[0] && Convert.ToDouble(pictureBoxPet.Location.Y) + MovePetSlope[1] <= MovePetTarget[1])
                {
                    MovePetWorker(pictureBoxPet, pictureBoxPet.Location.X + MovePetSlope[0], pictureBoxPet.Location.Y + MovePetSlope[1]);
                    //MsgBox("MovePetSlope[0] > 0 and MovePetSlope[1] > 0", "");
                }
                else if (MovePetSlope[1] < 0 && Convert.ToDouble(pictureBoxPet.Location.X) + MovePetSlope[0] <= MovePetTarget[0] && Convert.ToDouble(pictureBoxPet.Location.Y) + MovePetSlope[1] >= MovePetTarget[1])
                {
                    MovePetWorker(pictureBoxPet, pictureBoxPet.Location.X + MovePetSlope[0], pictureBoxPet.Location.Y + MovePetSlope[1]);
                    //MsgBox("MovePetSlope[0] > 0 and MovePetSlope[1] < 0", "");
                }
                else
                {
                    MovePetMoving = false;
                    //MsgBox("Error", "");
                }
            }
            else if (MovePetSlope[0] < 0)
            {
                if (MovePetSlope[1] > 0 && Convert.ToDouble(pictureBoxPet.Location.X) + MovePetSlope[0] >= MovePetTarget[0] && Convert.ToDouble(pictureBoxPet.Location.Y) + MovePetSlope[1] <= MovePetTarget[1])
                {
                    MovePetWorker(pictureBoxPet, pictureBoxPet.Location.X + MovePetSlope[0], pictureBoxPet.Location.Y + MovePetSlope[1]);
                    //MsgBox("MovePetSlope[0] < 0 and MovePetSlope[1] > 0", "");
                }
                else if (MovePetSlope[1] < 0 && Convert.ToDouble(pictureBoxPet.Location.X) + MovePetSlope[0] >= MovePetTarget[0] && Convert.ToDouble(pictureBoxPet.Location.Y) + MovePetSlope[1] >= MovePetTarget[1])
                {
                    MovePetWorker(pictureBoxPet, pictureBoxPet.Location.X + MovePetSlope[0], pictureBoxPet.Location.Y + MovePetSlope[1]);
                    //MsgBox("MovePetSlope[0] < 0 and MovePetSlope[1] < 0" + Convert.ToString(pictureBoxPet.Location.X) + MovePetSlope[0] + MovePetTarget[0], "");
                }
                else
                {
                    MovePetMoving = false;
                    //MsgBox("Error", "");
                }
            }
        }

    }

就是这样。如果你想知道所有提到“宠物”的意思,我正在为我的小妹妹制作一个类似电子宠物(或者你拼写它)的游戏。

我遇到的问题是 MovePetSlope[1] 或 [0] 的值可以是正数或负数。我提出了一些适用于正值的比较,但没有一个适用于负值的比较。我相信在它目前的状态下,它根本不起作用。

任何帮助将不胜感激。

提前致谢!

【问题讨论】:

  • 您到底想完成什么?不管是什么,我怀疑更多的 if 和 else 是答案。
  • 我试图让图像在到达目标目的地后停止移动。对初始职位的修改;当前的代码确实有效,我正在考虑另一个我尝试过的代码。
  • 一个字:重构。您拥有的代码很难使用、查看,因此容易出错。作为第一步,我将在初始 if 块之前分配并转换您正在比较的值。你会看到它更容易阅读,我毫不怀疑你会发现一个愚蠢的错误。
  • 例如将 Convert.ToDouble(pictureBoxPet.Location.X) 更改为双倍 petLocX = Convert.ToDouble(pictureBoxPet.Location.X);如果 (...

标签: c# comparison move target


【解决方案1】:

尝试使用 Math.Abs​​ 来简化您的比较。 一般来说,宠物应该一直移动到Math.Abs(pictureBoxPet.Location.X-MovePetTarget[0]) &lt; Math.Abs(MovePetSlope[0]),对于 Y 和 1 也是如此。您应该得到更简单的代码。

如果您的宠物直接向目标移动,这应该可以解决问题:

if (MovePetMoving)
{
    if (Math.Abs(pictureBoxPet.Location.X-MovePetTarget[0]) < Math.Abs(MovePetSlope[0]))
        MovePetMoving = false;
    else
        MovePetWorker(pictureBoxPet, pictureBoxPet.Location.X + MovePetSlope[0], pictureBoxPet.Location.Y + MovePetSlope[1]);
}

【讨论】:

  • 谢谢 Mick,我现在就试试。我也会查找“折射镜”。编辑:哈哈,折射是为了简化。 :)
  • 它只是意味着以一种更易于查看和维护的方式重写相同的代码,或者只是更优雅或更有用。
  • 成功了!我只需要将小于号更改为大于号,但这可能是因为我不清楚解释这些值通常是什么。谢谢!
【解决方案2】:

不同的策略:

  1. 定义一个 Rectangle 类型的变量,它在屏幕坐标中保存目标边界:根据您定义的一些阈值变量,根据需要增加边界。

  2. 为 PictureBox 定义 MouseUp 和 MouseDown 事件处理程序

  3. 定义一个布尔变量(在表单范围内),当鼠标在 PictureBox 上按下时(在 MouseDown 事件处理程序中)设置为 true,在 PictureBox 的 MouseUp 处理程序中设置为 false。

  4. 为 PictureBox 定义一个 MouseMove 事件处理程序,其中:

    一个。如果布尔变量为真(鼠标已按下)

    1. 使用 Rectangle.IntersectsWith 方法查看 PictureBox 的当前边界是否与目标边界矩形重叠。 MSDN Rectangle.IntersectsWith : 如果你知道你可以停下来。

恕我直言,使用此策略您可以编写大大简化的代码。

【讨论】:

  • 谢谢 BillW,我也会调查一下。虽然我没有使用鼠标,但“策略提示”#s 1 和 4b 对我有用。谢谢!
猜你喜欢
  • 2012-10-18
  • 2018-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多