2011-10-19 4 views
1

私は最初の非コンソールゲームをVisual C#で作成しています。 私はピクチャーボックスであるプレーヤーと、ピクチャーボックスである障害物を持っています。 ここでは、ランダムな位置に障害物(絵文字)を作成するときに、すでに他の障害物に触れているかどうかを確認したいと思います。C#2つのピクチャボックスが互いに接触しているかどうかを素早く確認していますか?

は、ここで私が今持っているものです。

Picturebox obstacles = new Picturebox[20]; 
for (int i = 0; i < obstacles.Length; i++) 
{ 
    DateTime date = DateTime.Now; 
    Random randomNumber = new Random(date.Second * (date.Minute/2)^2 + date.Hour * 123 + (i^9 + i/2)); 
    obstacles[i] = new PictureBox(); 
    obstacles[i].Image = Properties.Resources.es; 
    obstacles[i].Size = new Size(25, 50); 
    obstacles[i].Location = new Point(randomNumber.Next(640 - obstacles[i].Image.Width), randomNumber.Next(topBar.Height, 480 - obstacles[i].Image.Height)); 
    if (IsTouching(obstacles[i], player)) 
    { 
     i--; 
    } 
    else 
    { 
     bool tmp = true; 
     for (int j = 0; j < obstacles.Length; j++) 
     { 
      if (obstacles[j] != null && j != i) 
      { 
       if (IsTouching(obstacles[j], obstacles[i])) 
       { 
        tmp = false; 
        break; 
       } 
      } 
     } 
     if (tmp) 
     { 
      Controls.Add(obstacles[i]); 
     } 
     else 
     { 
      i--; 
     } 
    } 
} 

それは、これらの障害物を作成するために、しばらく(約5秒)かかり原因だから、それは私の方法ですが、私はそれが本当に効果的ではありません知っているので、任意のより良いアイデア。 ここに私のIsTouchingメソッドがあります。これはちょっとでもおかしなことですが、誰かがより良いアイデアを持っていますか?

private bool IsTouching(PictureBox obj1, PictureBox obj2) 
{ 
    Point[] obj1Points = new Point[(obj1.Width * obj1.Height) - ((obj1.Width - 2) * (obj1.Height - 2))]; 
    int count = 0; 
    for (int x = obj1.Left + 1; x < obj1.Left + obj1.Width - 1; x++) 
    { 
     obj1Points[count] = new Point(x, obj1.Top); 
     obj1Points[count + 1] = new Point(x, obj1.Top + obj1.Height); 
     count += 2; 
    } 
    for (int y = obj1.Top; y < obj1.Top + obj1.Height; y++) 
    { 
     obj1Points[count] = new Point(obj1.Left, y); 
     obj1Points[count + 1] = new Point(obj1.Left + obj1.Width, y); 
     count += 2; 
    } 

    Point[] obj2Points = new Point[(obj2.Width * obj2.Height) - ((obj2.Width - 2) * (obj2.Height - 2))]; 
    count = 0; 
    for (int x = obj2.Left + 1; x < obj2.Left + obj2.Width - 1; x++) 
    { 
     obj2Points[count] = new Point(x, obj2.Top); 
     obj2Points[count + 1] = new Point(x, obj2.Top + obj2.Height); 
     count += 2; 
    } 
    for (int y = obj2.Top; y < obj2.Top + obj2.Height; y++) 
    { 
     obj2Points[count] = new Point(obj2.Left, y); 
     obj2Points[count + 1] = new Point(obj2.Left + obj2.Width, y); 
     count += 2; 
    } 

    for (int obj2Point = 0; obj2Point < obj2Points.Length; obj2Point++) 
    { 
     for (int obj1Point = 0; obj1Point < obj1Points.Length; obj1Point++) 
     { 
      if (obj2Points[obj2Point].X == obj1Points[obj1Point].X && obj2Points[obj2Point].Y == obj1Points[obj1Point].Y) 
      { 
       return true; 
      } 
     } 
    } 
    return false; 
} 

説明:指定された2つのパラメータのエッジが互いに接触するかどうかを確認します。だから基本的に衝突検出、誰もが、私はこのようなものでちょっと新しいの原因を考えている?

答えて

3

我々は、すべての障害物が固体(もう一方は他の内側にある場合、すなわち2障害物が触れる)であると仮定した場合、あなたは次のメソッドを使用することができます。

private bool IsTouching(PictureBox p1, PictureBox p2) 
{ 
    if (p1.Location.X + p1.Width < p2.Location.X) 
     return false; 
    if (p2.Location.X + p2.Width < p1.Location.X) 
     return false; 
    if (p1.Location.Y + p1.Height < p2.Location.Y) 
     return false; 
    if (p2.Location.Y + p2.Height < p1.Location.Y) 
     return false; 
    return true; 
} 

は、私はあなたの現在の IsTouching方法をテストし、見つけました this oneなどのコーナーケースで失敗することがあります(それは彼らが触っていないと主張しています)。私の方法はこれらのコーナーケースでも機能します。

-1

これには単純なコード行が1つありますが、時にはコーナーピースによっては失敗することもあります。

player1をpictureboxの名前に置き換え、同じものをplayer2 ofcと置き換えます。

関連する問題