PictureBox的C#碰撞检查(相交)

时间:2018-10-02 19:23:28

标签: c# game-physics

很长一段时间以来我一直在挑战这个问题。简而言之,我想避免两个图片框之间的冲突。当pictureBox1看到pictureBox2时,必须停止。但是,我确实通过Intersect做到了这一点。像下面的代码一样;

 private void method(PictureBox b)
    {
        if (pictureBox1.Bounds.IntersectsWith(b.Bounds)) {
            movement = false;}                                         
    }

问题是按键。我用KeyDown(W,A,S,D)移动pictureBox1,当我按住这些键时,相交代码可以很好地工作。但是,当我一键按下时,它只是滑入pictureBox2中。如何避免这种情况?我确实尝试用boolean来阻止它,但是没有用。我想我需要if语句,但我无法做出逻辑。寻找您的解决方案。预先感谢。

KeyDown事件;

 private void Form1_KeyDown(object sender, KeyEventArgs e)
    {

        if (movement == true)
        {
            int x = pictureBox1.Location.X;
            int y = pictureBox1.Location.Y;

            if (e.KeyCode == Keys.W) y -= chrspeed;
            else if (e.KeyCode == Keys.A) x -= chrspeed;
            else if (e.KeyCode == Keys.D) x += chrspeed;
            else if (e.KeyCode == Keys.S) y += chrspeed;

            pictureBox1.Location = new Point(x, y);
            method(pictureBox2);

        }


    }

chrspeed是20;

KeyUp事件;

private void Form1_KeyUp(object sender, KeyEventArgs e)
    {
        movement = true;


    }

2 个答案:

答案 0 :(得分:0)

我将其放入KeyDown事件处理程序并删除KeyUp事件处理程序。代码的问题在于,每次释放密钥时, movement标志都会重置为true。 这应该做您想要的:

private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
                int x = pictureBox1.Location.X;
                int y = pictureBox1.Location.Y;

                if (e.KeyCode == Keys.W) y -= chrspeed;
                else if (e.KeyCode == Keys.A) x -= chrspeed;
                else if (e.KeyCode == Keys.D) x += chrspeed;
                else if (e.KeyCode == Keys.S) y += chrspeed;

                Rectangle newRect = new Rectangle(x, y, pictureBox1.Width, pictureBox1.Height);
                if (!newRect.Bounds.IntersectsWith(pictureBox2.Bounds)) {
                    pictureBox1.Location = new Point(x, y);
                }
            }
        }

不需要movement标志。它的作用是,如果两个图片框不相交,它将设置新位置。

请注意,当图片框发生碰撞时,您仍然可以按另一个键再次移开。

Edit

您的评论绝对正确,对此表示抱歉。 我现在更改了代码,因此它使用新位置来计算它们是否相交。

答案 1 :(得分:0)

在您的代码中发生的事情“可行”了(没有,您很幸运)是,两个Picbox第一次相交,picbox1在picbox2中移动,method返回了false,下次它没有输入if语句。 您需要先致电method(),然后再移动picbox1,然后然后检查true or false

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    int x = pictureBox1.Location.X;
    int y = pictureBox1.Location.Y;

    if (e.KeyCode == Keys.W) y -= chrspeed;
    else if (e.KeyCode == Keys.A) x -= chrspeed;
    else if (e.KeyCode == Keys.D) x += chrspeed;
    else if (e.KeyCode == Keys.S) y += chrspeed;

    method(new Rectangle(x, y, pictureBox1.Width, pictureBox1.Height), pictureBox2 );

    if (movement == true)
    {
        pictureBox1.Location = new Point(x, y);
    }

}

private void method(Rectangle rect, PictureBox b)
{
    if (rect.IntersectsWith(b.Bounds)) {
        movement = false;}                                         
}