如何在目标阈值内简化图像的停止运动

时间:2010-01-16 06:10:50

标签: c# comparison move target

我已经尝试解释我正在尝试对别人做些什么,并且失败了。因此,如果您原谅我,我只会告诉您代码并尝试解释一下。

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

    }

就是这样。如果你想知道所有对“宠物”的引用,我正在制作一个tamogotchi(或者你拼写它),就像我的小妹妹的游戏一样。

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

非常感谢任何帮助。

提前致谢!

2 个答案:

答案 0 :(得分:1)

尝试使用Math.Abs​​来简化比较。 一般情况下,宠物应该一直移动到Math.Abs(pictureBoxPet.Location.X-MovePetTarget[0]) < 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]);
}

答案 1 :(得分:1)

另一种策略:

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

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

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

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

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

    1. 使用Rectangle.IntersectsWith方法查看PictureBox的当前边界是否与目标边界矩形重叠。 MSDN Rectangle.IntersectsWith:如果知道你可以停止。
  5. imho,使用这种策略,你可以编写大大简化的代码。