如何确定鼠标穿过矩形的哪一边

本文关键字:何确定 鼠标 | 更新日期: 2023-09-27 18:29:01

我正在开发一种游戏,在这种游戏中,鼠标被一个矩形包围,使用以下代码:

    Rectangle box = new Rectangle(113, 113, 276, 276);
    char direction;
    private void Form1_MouseMove(object sender, MouseEventArgs e)
    {
        if (box.Contains(e.Location))
        {
            temp = new Point(e.Location.X, e.Location.Y + 23);
        }
        else
        {
            Cursor.Position = temp;
        }
    }

我需要确定鼠标试图穿过哪一边,并将字符方向设置为"n"、"s"、"e"或"w"。我尝试了一系列if语句:

    // West - East
    if (e.Location.X < temp.X)
    {
        direction = 'w';
    }
    if (e.Location.X > temp.X)
    {
        direction = 'e';
    }
    // North - South
    if (e.Location.Y + 23 < temp.Y)
    {
        direction = 'n';
    }
    if (e.Location.Y + 23 > temp.Y)
    {
        direction = 's';
    }

问题是,如果鼠标以一定角度靠近东侧或西侧,它将向北或向南返回。由于点的性质,在W-E轴上返回true的语句可以在N-S轴上同时返回true。我如何才能使它返回正确的墙,而不管它与边缘的接触角度如何?

如何确定鼠标穿过矩形的哪一边

我怀疑问题是你只在temp在盒子里时设置它,而不是在盒子外面,这段代码有效:

Rectangle box = new Rectangle(113, 113, 276, 276);
char direction;
Point temp;
private void Form1_Paint(object sender, PaintEventArgs e)
{
    using (Graphics g = this.CreateGraphics())
    {
        Pen pen = new Pen(Color.Black, 2);
        g.DrawRectangle(pen, box);
        pen.Dispose();
    }
}
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
    temp = new Point(e.Location.X, e.Location.Y);    
    if (box.Contains(temp.X, temp.Y))
    {
        textBox1.Text = temp.X + " , " + temp.Y;
    }
    else
    {
        //COMMENT OUT THIS LINE FOR MOVEMENTS OUTSIDE THE Box
        if (textBox1.Text.Length == 1) return;
        if (box.Left >= temp.X)
        {
            direction = 'w';
        }
        else if (box.Left + box.Width <= temp.X)
        {
            direction = 'e';
        }
        else if (box.Top >= temp.Y)
        {
            direction = 'n';
        }
        else if (box.Top + box.Height <= temp.Y)
        {
            direction = 's';
        }
        textBox1.Text = direction.ToString();
    }
}