2013-06-27 89 views
1

我有2张图片(bar和greenBall1)。酒吧可以上下移动取决于用户的反应。而greenBall1正在屏幕上移动。如果两个图像相互接触,我想进行图像碰撞,greenBall1将改变其速度。我对greenBall1的代码如下。如何在使用Windows Phone应用程序的Windows Phone 8的C#中执行图像冲突?

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; 
     } 
     } 
+0

你想要做圈的碰撞? http://stackoverflow.com/questions/1736734/circle-circle-collision –

+0

不,我希望做一个矩形的碰撞。基本上我就像在球击中矩形杆时试图做出反弹一样,现在球会穿过我的酒吧。 –

+0

是否限制像Pong一样上下移动? –

回答

0

我在代码中看不到对条形对象的引用。但碰撞的检测比处理碰撞的物理要容易得多。有几种学派的思想和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类型碰撞here的讨论。

+0

我打算启用酒吧上下移动。但截至目前,我还没有这样做。我可以知道我应该声明X是什么吗?我遇到了一个错误,说'System.Windows.Controls'不包含'X'的定义,也没有接受第一个参数类型的扩展方法'X'。 –

+0

@ Gwenda.T对不起,我正在使用X,好像对象leftBar具有X位置属性。现在你有了代码的方式,如果你希望:“var leftBarPositionX = Canvas.GetLeft(this.LeftBar);” –

+0

这不起作用,球仍然通过酒吧。 –

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; 
      } 

在这个时候,球会与碰撞手会增加它的速度,并改变其方向我认为是认为你正在寻找的,因为它也是一个矩形碰撞。

+0

我不想使用XNA。你有其他想法吗? –

+0

为什么你不想使用XNA?只是问,因为这将是最好的方式来做碰撞在XNA中很容易检测到.. –

+0

我被告知不要使用它。 XNA兼容,但是Microsoft不再支持它。 –

0

使一类,这将给你看重的阉2个rects会发生碰撞或不

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"); 
} 
相关问题