2013-06-27 31 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"); 
} 
相關問題