2014-02-21 41 views
0

我正試圖檢測窗體中的對象何時比窗體本身更大。當它確實一個MessageBox應該與文本「Game over」一起出現時。窗體對象碰撞檢測的邏輯不正確。

這是我做了什麼:

X軸

private void CollisionXForward() 
    { 
     int x = this.Width; //the width of the form is 493 

     //if the position of x-axis of the rectangle goes over the limit of the form... 
     if (rc.PositionX >= x) 
     { 
      //...game over 
      MessageBox.Show("Game over"); 

     } 
     else 
     { 
       //move the object +5 every time i press right arrow 
      rc.MoveXForward(); 

     } 

的事情是,矩形自敗,因爲它更進了一步比框架本身。我已經通過聲明「解決」了問題:

if (rc.PositionX >= x - (rc.Width * 2)) 

而不是您在代碼中看到的正常問題。但是當我用y軸做同樣的事情或者當我改變矩形的大小時,它不起作用。

+0

不要你的意思'rc.Width/2':那如果你需要留出空間了一步,然後測試這樣的測試變得容易

if (this.ClientRectangle.Contains(rc.BoundingBox)) { rc.MoveXForward(); } else { MessageBox.Show("Game over"); } 

? –

+0

您應該使用'ClientRectangle.Width'和'ClientRectangle.Height',因爲常規的'Width'和'Height'包含標題欄和窗體邊框。也許這是垂直問題。 –

+0

@ 500-InternalServerError沒有任何建議工作 – Mnemonics

回答

0

嘗試:

if (rc.PositionX + rc.Width >= ClientRectangle.Width) 

if (rc.PositionY + rc.Height >= ClientRectangle.Height) 

編輯:

private void CollisionXForward() 
{ 
    rc.MoveXForward(); 

    //if the position of x-axis of the rectangle goes over the limit of the form... 
    if (rc.PositionX + rc.Width >= ClientRectangle.Width) 
    { 
     //...game over 
     MessageBox.Show("Game over"); 

    } 
} 

private void CollisionXForward() 
{ 
    //if the position of x-axis of the rectangle goes over the limit of the form... 
    if (rc.PositionX + step + rc.Width >= ClientRectangle.Width) //step is 5 in your case 
    { 
     //...game over 
     MessageBox.Show("Game over"); 

    } 
    else 
    { 
     //move the object +5 every time i press right arrow 
     rc.MoveXForward(); 

    } 
} 

瓦爾特

+0

它工作時,我添加了5而不是一個。是否因爲矩形每次按下按鈕時會移動+5? – Mnemonics

+0

@Mnemonics你的問題是,你先檢查,然後移動。做相反的事情:先行動然後檢查。 –

+0

你是什麼意思?我應該先調用方法rc.MoveXForward,然後如果(rc.PositionX + rc.Width + 1> = x) MessageBox.Show(「Game over」); } – Mnemonics

0

給你的rc對象一個BoundingBox屬性返回Rectangle

if (this.ClientRectangle.Contains(rc.BoundingBox.Inflate(step, step))) { 
    rc.MoveXForward(); 
} else { 
    MessageBox.Show("Game over"); 
} 

public class MyRcClass 
{ 
    ... 
    public Rectangle BoundingBox 
    { 
     get { return new Rectangle(PositionX, PositionY, Width, Height); } 
    } 
} 
+0

這實際上工作得很好。但我更喜歡先說移動物體然後檢查。我想我會在將來使用你的建議。謝謝。 – Mnemonics