2014-12-04 30 views
0

我有一個球根據需要從槳和牆壁反彈,然後我通過draw.Rectangle工具添加了一個單獨的磚,並有球從這反彈,然後改變它的顏色但無法阻止任何進一步的碰撞。 我正在使用一個數組作爲我的磚,因爲我可以有很多,可以打他們後真或假試圖讓球從數組組件中反彈回來? (不能想到一個更好的詞)C#

我的問題是,我試圖讓球與所述陣列磚碰撞,但不能爲即使盡可能多地使用google搜索,我的生活也會發現它。這裏是我的代碼片斷,我認爲「應該」的碰撞

for (int i = 0; 1 < brickLive.Length; i++) 
       if ((y == brickLocation[i, 0]) && (x >= brickLocation[0, i]) && (x <= (brickLocation[0, i] + 60))) 
        yChange = -yChange; 

我的理解這個工作代碼爲說的價值我檢查,如果球COORDS是在一個磚的位置的參數。如果是那麼改變方向。 與它運行良好,直到我開始遊戲當前的代碼(我點擊插入按鈕,使反彈按鈕工作)

這裏是我的全部代碼

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace Breakout 
{ 
    public partial class Form1 : Form 
    { 

     private int x, y, x2, y2; 
     private int xChange, yChange; 

     int bat, batX, batXX, mouseX; 

     private Graphics paper; 
     private Pen pen, pen2, pen3; 

     private Pen brkpen; 

     private Random ranNum; 

     int brkLength = 60; 
     int brkHeight = 20; 
    int[,] brickLocation = { { 0, 100 }, { 61, 100 }, { 122, 100 } }; 
    bool[] brickLive = { true, true, true }; 


    public Form1() 
    { 
     InitializeComponent(); 

     paper = picDisplayBat.CreateGraphics(); 
     pen = new Pen(Color.Red); 
     pen.Width = 10; 
     ranNum = new Random(); 

     paper = picDisplayBat.CreateGraphics(); 
     pen = new Pen(Color.Blue); 
     pen.Width = 3; 

     paper = picDisplayBat.CreateGraphics(); 
     pen2 = new Pen(Color.Red); 
     pen.Width = 3; 

     picDisplayBat.MouseMove += new 
     System.Windows.Forms.MouseEventHandler(picDraw_MouseMove); 

     paper = picDisplayBat.CreateGraphics(); 
     brkpen = new Pen(Color.Black); 
     brkpen.Width = 3; 


     //paper = picDisplayBat.CreateGraphics(); 
     //pen3 = new Pen(Color.Green); 
     //pen3.Width = 5; 
} 


    private void picDraw_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)       //DRAWING THE BAT TO MOVE WITH MOUSE 
    { 
     //paper.Clear(Color.White); 
     mouseX = e.X; 
    } 


    private void btnInsert_Click_1(object sender, EventArgs e) 
    { 
     { 
      btnBounce.Visible = true; 
     } 
    } 

    private void btnBounce_Click_1(object sender, EventArgs e) 
    { 
     { 

      timer1.Interval = 25; 
      timer1.Enabled = true; 

      x = ranNum.Next(1, picDisplayBat.Height); 
      y = ranNum.Next(1, picDisplayBat.Width); 
      xChange = ranNum.Next(1, 10); yChange = ranNum.Next(1, 10); 


      for (int i = 0; i < brickLive.Length; i++) 
      { 
       paper.DrawRectangle(brkpen, brickLocation[i, 0], brickLocation[i, 1], brkLength, brkHeight); 


      } 

     } 
    } 

    private void timer1_Tick(object sender, EventArgs e) 
    { 
     { 

      x = x + xChange; 
      y = y + yChange; 
      if (x >= picDisplayBat.Width) 
       xChange = -xChange; 

      if (y >= picDisplayBat.Height) 
       yChange = -yChange; 

      if (x <= 0) 
       xChange = -xChange; 

      if (y <= 0) 
       yChange = -yChange; 

      if ((y > picDisplayBat.Height - 20) && (x >= batX + 10) && (x <= batX + 50)) 
       yChange = -yChange; 

      if ((y < picDisplayBat.Height - 295) && (x >= batX + 10) && (x <= batX + 50)) 
       yChange = -yChange; 

      for (int i = 0; 1 < brickLive.Length; i++) 
       if ((y == brickLocation[i, 0]) && (x >= brickLocation[0, i]) && (x <= (brickLocation[0, i] + 60))) 
        yChange = -yChange; 



       paper.Clear(Color.White); 
      paper.DrawRectangle(pen, mouseX + 10, picDisplayBat.Height - 20, 50, 10);   //bat 1 
      paper.DrawEllipse(pen, x, y, 10, 10);            //ball 
      paper.DrawRectangle(pen2, mouseX + 10, picDisplayBat.Height - 295, 50, 10);  //bat2 
      //paper.DrawRectangle(pen3, x2, y2, 60, 10); 
      bat = mouseX; 
      batX = mouseX; 
      batXX = mouseX; 

      for (int i = 0; i < brickLive.Length; i++) 
      { 
       paper.DrawRectangle(brkpen, brickLocation[i, 0], brickLocation[i, 1], brkLength, brkHeight); 


      } 
     } 
    } 

    private void btnExit_Click(object sender, EventArgs e) 
    { 

    Environment.Exit(0); 

    } 

    private void btnStop_Click(object sender, EventArgs e) 
    { 


      timer1.Enabled = false; 
      paper.Clear(Color.White); 

     } 

} 

}

+0

可能的重複[嘗試使用彈跳球撞擊陣列來製造磚塊。 C#](http://stackoverflow.com/questions/27299706/trying-to-kill-bricks-made-by-an-array-using-collision-with-a-bouncing-ball-cs) – Plutonix 2014-12-04 18:41:46

+0

那個不是很好,因此它的負面和slating所以我做了一個更好的,看到我的編輯版本看到沒有幫助 – 2014-12-04 19:00:46

回答

0

這看起來不對我。

if ((y == brickLocation[i, 0]) && (x >= brickLocation[0, i]) && (x <= (brickLocation[0, i] + 60)))

在我看來,你應該始終有[i, ...爲磚陣列的位置,所以無論是[i, 0]針對用於垂直分量的水平分量和[i, 1]測試。

+0

它運行在循環罰款(ive完成休息,並觀察它通過循環),但一旦它通過循環第四它崩潰並且說 在Breakout.exe中發生未處理的異常類型'System.IndexOutOfRangeException' 其他信息:索引超出了數組的範圍。 – 2014-12-04 19:02:45

+0

你真的看過我的回答嗎? – 2014-12-04 19:09:32

+0

是的,我試過,並切換到你所說的,但它沒有工作 我回應的原因就是說它只是似乎打破後,我設置了一個值上面有多少組件數 – 2014-12-04 19:14:38