2

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

        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] 的值可以是正数或负数。我提出了一些适用于正值的比较,但没有一个适用于负值的比较。我相信在目前的状态下,它根本不起作用。

任何帮助将不胜感激。

提前致谢!

4

2 回答 2

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]);
}
于 2010-01-16T06:20:29.107 回答
1

不同的策略:

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

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

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

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

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

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

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

于 2010-01-16T06:34:23.107 回答