C# 如何简化在目标阈值范围内停止图像运动

C# 如何简化在目标阈值范围内停止图像运动,c#,comparison,move,target,C#,Comparison,Move,Target,我已经试着向别人解释我要做什么,但失败得很惨。因此,如果您不介意的话,我将向您展示代码并尝试解释一下 if (MovePetMoving) { if (MovePetSlope[0] > 0) { if (MovePetSlope[1] > 0 && Convert.ToDouble(pictureBoxPet.Location.X) + MovePetSl

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

        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", "");
                }
            }
        }

    }
if(MovePetMoving)
{
如果(移动斜率[0]>0)
{
如果(MovePetSlope[1]>0&&Convert.ToDouble(picturebexpet.Location.X)+MovePetSlope[0]>0&&Convert.ToDouble(picturebexpet.Location.X)+MovePetSlope[0]&Convert.ToDouble(picturebexpet.Location.X)+MovePetSlope[1]>=MovePetTarget
{
MovePetWorker(PictureBExpet,PictureBExpet.Location.X+MovePetSlope[0],PictureBExpet.Location.Y+MovePetSlope[1]);
//MsgBox(“MovePetSlope[0]<0和MovePetSlope[1]<0”+Convert.ToString(picturebexpet.Location.X)+MovePetSlope[0]+MovePetTarget[0],”);
}
其他的
{
MovePetMoving=false;
//MsgBox(“错误”,“错误”);
}
}
}
}
就在那里。如果你想知道所有提到“宠物”的地方,我正在为我的小妹妹做一个类似tamogotchi(或者你怎么拼写它)的游戏

我的问题是MovePetSlope[1]或[0]的值可以是正的,也可以是负的。我做了一些比较,对正值有效,但对负值无效。我相信在目前的状态下,它根本不起作用

任何帮助都将不胜感激


提前谢谢

尝试使用Math.Abs简化比较。 一般来说,宠物应该一直移动,直到
Math.Abs(picturebexpet.Location.X-MovePetTarget[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]);
}
if(MovePetMoving)
{
if(Math.Abs(picturebexpet.Location.X-MovePetTarget[0])
另一种策略:

  • 定义一个矩形类型的变量,该变量保持屏幕坐标中的目标边界:根据您定义的某个阈值变量,根据需要增加边界

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

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

  • 为PictureBox定义MouseMove事件处理程序,其中:

    a。如果布尔变量为true(鼠标按下)

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

  • 嗯,使用这个策略,你可以编写大大简化的代码。

    你到底想完成什么?不管是什么,我怀疑更多的ifs和ELSE是答案。我试图让图像在到达目标后停止移动。对最初职位的修改;当前的代码实际上是有效的,我正在考虑另一个我已经尝试过的代码。一个词:重构。您所使用的代码很难使用、查看,因此容易出错。作为第一步,我将在初始if块之前分配和转换要比较的值。你会发现阅读起来会容易得多,我毫不怀疑你会发现一个愚蠢的错误。将Convert.ToDouble(picturebexpet.Location.X)更改为double-petLocX=Convert.ToDouble(picturebexpet.Location.X);如果(…谢谢Mick,我现在就试试。我还将查找“折射器”。编辑:哈哈,折射器是为了简化。:)它只是意味着以一种更易于查看和维护,或者更优雅或更有用的方式重写相同的代码。它成功了!我只需要将小于号改为大于号,但这可能是因为我不清楚这些值通常是什么。谢谢谢谢BillW,我也会调查的。虽然我没有使用鼠标,“策略提示”1和4b对我来说很有用。谢谢