1

我有 2 张图片(条形图和 greenBall1)。bar 可以上下移动取决于用户的反应。同时,greenBall1 在屏幕上移动。如果两个图像相互接触,我想做一个图像碰撞,greenBall1 会改变它的速度。我对 greenBall1 的代码如下。

 private void OnUpdate(object sender, object e)
 {
         Canvas.SetLeft(this.GreenBall1, this.greenBallVelocityX + Canvas.GetLeft(this.GreenBall1));
         Canvas.SetTop(this.GreenBall1, this.greenBallVelocityY + Canvas.GetTop(this.GreenBall1));



        var greenBallPositionX1 = Canvas.GetLeft(this.GreenBall1);
         var greenBallPositionY1 = Canvas.GetTop(this.GreenBall1);



        var maximumGreenBallX = ActualWidth - this.GreenBall1.ActualWidth;
         var maximumGreenBallY = 400 - this.GreenBall1.ActualHeight; //Improvise: Instead of 360, get maximum height of canvas



        if (greenBallPositionX1 > maximumGreenBallX || greenBallPositionX1 < 0)
         {
             this.greenBallVelocityX *= -1;
         }



        if (greenBallPositionY1 > maximumGreenBallY || greenBallPositionY1 < 0)
         {
             this.greenBallVelocityY *= -1;
         }
      }
4

3 回答 3

0

我在您的代码中没有看到对 bar 对象的引用。但是碰撞的检测比处理碰撞的物理要容易得多。像 Pong 碰撞这样简单的事情有多种思想流派,您选择处理它的方式取决于您想要的游戏玩法。

这是一种检测和处理碰撞的简单方法,只需在处理墙壁碰撞时取消 X 速度即可:

if(greenBallPositionX1 < leftBar.X || greenBallPositionX1 > rightBar.X)
{
    this.greenBallVelocityX *= -1;
}

请记住,您可能还必须考虑条形或球的宽度,具体取决于坐标相对于图像的位置。例如:

if(greenBallPositionX1 < (leftBar.X + leftBar.Width) || greenBallPositionX1 > rightBar.X)
{
    this.greenBallVelocityX *= -1;
}

此时您可能还希望将球从桨叶移开一步,以避免多次检测到碰撞。

希望这能回答您的问题,但如果您正在寻找对碰撞检测更复杂的反应,那么您可能需要在此处查看关于 Pong 类型碰撞的以下讨论。

于 2013-06-27T02:19:03.760 回答
0

我想这可能会帮助你....

.

            Rectangle ballRect = new Rectangle((int)ballposition.X, (int)ballposition.Y, ballsprite.Width, ballsprite.Height);

            Rectangle handRect = new Rectangle((int)paddlePosition.X, (int)paddlePosition.Y, paddleSprite.Width, paddleSprite.Height/2);

            if (ballRect.Intersects(handRect))
            {
                // Increase ball speed
                ballSpeed.Y += 50;

                if (ballSpeed.X < 0)
                    ballSpeed.X -= 50;

                else
                    ballSpeed.X += 50;

                // Send ball back up the screen

                ballSpeed.Y *= -1;
            }

在这种情况下,每当球与手发生碰撞时,它都会增加它的速度并改变它的方向,我认为这就是你正在寻找的想法,因为它也是一个矩形碰撞。

于 2013-06-27T04:49:46.867 回答
0

做一个类,它会给你两个矩形是否会碰撞的价值

    public bool Intersects(Rect r1,Rect r2)
    {
      r1.Intersect(r2);

      if(r1.IsEmpty)
      {
        return false;
      }
      else 
      {
        return true;
      }
    }

那么你可以使用

if(Intersects(r1,r2))
{
  MessageBox.Show("Collison Detected");
}
于 2013-07-04T05:01:56.227 回答