2011-01-30 10 views
1

私はXNAで開発された小さなゲーム(5クラス)を持っています。ボールが窓の周りを跳ね返り、窓の両側に衝突すると直角に動く。ユーザはウィンドウ内の任意の場所にマウスをドラッグすることによってマーキーを作成します。マーキーが作成され、確認されると、ボールがマーキーに当たるたびに、それが削除されます。私は2次元配列で私のボールを持っており、このタイプの配列からボールを​​取り除く方法を知りました。現在、私は次のことを行っています:ランダム化された条件に基づいて2次元配列からアイテムを削除するにはどうすればよいですか?

Rectangle ball = new Rectangle((moveBallX - 4), (moveBallY - 4), moveBallX, moveBallY); 
Rectangle marquee = new Rectangle(tempInitialX, tempInitialY, tempWidth, tempHeight); 
if (ball.Intersects(marquee)) 
{ 
    balls[rowIndex, columnIndex].SetRed(0); 
    balls[rowIndex, columnIndex].SetGreen(0); 
    balls[rowIndex, columnIndex].SetBlue(0); 
} 

これはマーキーを黒にするボールが見えなくなるようにします。私はボード上に残っているボールの数を表示するなどのコードを使って他のことをしたいので、配列からアイテムを削除できるようにすると便利です。

お時間をいただきありがとうございます。

+0

2D配列(1Dの配列ではない)で?ただ好奇心が強い – Cameron

+0

良い質問。ゲームの最初の5秒間は静止している間に色が点滅して回転するため、2D配列に配置する方が簡単でした。彼らはそれが変更された場合、ゲームのウィンドウに柔軟性があったグリッドに配置されました。これらの理由から、私は2D配列を使用することを選択しました。 – kymully

答えて

1

ボールが配列されている場所にスポットを設定することができます。null。これは高速でシンプルです(配列のサイズ変更は必要ありません)が、最初にヌルをチェックするためにすべてのループを変更する必要があります。

ように、コードは次のようになります。あなたが別の変数にボールカウントを追跡することができます覚えておいてください

if (ball.Intersects(marquee)) 
{ 
    var deadBall = balls[rowIndex, columnIndex]; 
    balls[rowIndex, columnIndex] = null; 

    deadBall.SetRed(0); 
    deadBall.SetGreen(0); 
    deadBall.SetBlue(0); 
} 

を。これは、配列内のnull以外のボールの数を数えるより簡単で(しかも高速です)。

0

アイテムを削除する必要がある場合は、静的に2次元のボール配列を必要としない限り、リストを使用します。あなたは彼らが画面の周りにバウンスしていたと述べたので、行/列にそれらを保持する必要はないようです。

List<Ball> balls = new List<Ball>(); 

// Initialize the balls into a grid structure: 
for(int i=0; i < numberOfRows; i++) 
    for(int j=0; j < numberOfColumns; j++) 
     balls.Add(new Ball(i * gridWidth, j * gridHeight, Color.Blue); 

// ... some other code probably goes here ... 

var trash = balls.Where(ball => ball.Intersects(marquee)); 
foreach(Rectangle ball in trash) 
    balls.Remove(ball); 

私もこのように、いくつかのより多くの機能が含まれるように、あなたのボールのクラスを変更したい、あなたが書く必要があるだろうコードの量を削減するには、次のボールがあるのはなぜ

public class Ball 
{ 
    int X; 
    int Y; 
    Color color; 

    public Ball(int x, int y, Color c) 
    { 
     X = x; Y = y; color = c; 
    } 

    // Whatever else you have in your ball class goes here 

    public bool Intersects(Rectangle rect) 
    { 
     return new Rectangle(this.X - 4, this.Y - 4, this.X, this.Y).Intersects(rect); 
    } 


    public void MakeInvisible() 
    { 
     color = new Color(0, 0, 0, 0); 
    } 
} 
関連する問題