代码之家  ›  专栏  ›  技术社区  ›  Saladin Akara

检查碰撞的简单方法?

  •  4
  • Saladin Akara  · 技术社区  · 14 年前

    我正在为uni做一个任务,我必须在Visual Studio 2010中使用C#Win Forms创建一个突破性的游戏。目前,我只专注于只有一块砖头要被破坏,所以在展开之前,我先让机械师下来。

    为了澄清我目前的程序:我使用一个图片框作为图形对象和定时器来创建动画效果。在每一帧中,球可以跳过1到10像素这是为球创建随机起始向量的一部分。

    在检查球是否“击中”了我画的砖头之前,这个方法是可行的。我得到的是一个if语句,它检查球是否位于与砖块轮廓相对应的图片框上的任何坐标处。我知道逻辑是好的,因为它有时会起作用。但是,由于球位置的“跳跃”变化,我需要在if语句中添加一个正负5像素的缓冲区。

    这就是问题所在,因为 if 声明(两个,真的)是 真正地 虽然很复杂:

    // Checks if ball hits left side or top of brick
    if (((x >= brickX) && (x <= (brickX + 50)) && (y == brickY)) ||
        ((y >= brickY) && (y <= (brickY + 20)) && (x == brickX)))
    {
        brickHit = true;
    }
    // Check if ball hits right side or bottom of brick
    else if ((((x >= brickX) && (x <= brickX + 50)) && (y == (brickY + 20))) ||
        (((y >= brickY) && (y <= brickY + 20)) && (x == brickX + 50)))
    {
        brickHit = true;
    }
    

    需要说明的是:x和y是球的坐标,brickX和brickY是矩形砖左上角的坐标(宽50像素,高10像素)。

    有什么方法可以简化上面的if语句吗? 如果我能使它们更简单,我知道添加“缓冲区”(只需要砖块轮廓两边各5个像素,以允许球的位置变化)会容易得多。

    如果需要进一步的澄清,请问我在早上5:12写这个问题,这样我知道我可能有点不清楚。

    3 回复  |  直到 14 年前
        1
  •  3
  •   Lilith River    14 年前
    brickHit = new Rectangle(brickX,brickY,50,20).Contains(x,y);
    

    添加缓冲区:

    int buffer = 5;
    brickHit = new Rectangle(brickX,brickY,50,20).Inflate(buffer,buffer).Contains(x,y);
    

    Rectagle类有时可以派上用场。

        2
  •  5
  •   pstrjds    14 年前

    有一种方法可以简化这一点(我可能误解了您的规范),但是您可以在砖的边界之外创建一个矩形,并检查x、y点的包含。

    Rectangle rec = new Rectangle(brickX, brickY, 50, 20);
    rec.Offset(-5, -5);
    rec.Inflate(10, 10);
    if (rec.Contains(new Point(x,y))
    {
        brickHit = true;
    }
    
        3
  •  0
  •   user8721727 user8721727    7 年前

    这对我有效:

    var rect1 = new System.Drawing.Rectangle(pictureBox1.Location,
    pictureBox1.Size);
    var rect2 = new System.Drawing.Rectangle(pictureBox2.Location, 
    pictureBox2.Size);
    
    if (rect1.IntersectsWith(rect2))
    {
      //code when collided
    }