2013-10-24 4 views
0

Ниже код предназначен для создания случайных позиций для препятствий. Препятствия движутся справа налево, поэтому я использую координату x для перемещения в левом направлении. Когда препятствия достигают левой стороны экрана, он снова помещается в какую-то случайную позицию. Но здесь проблема заключается в том, что иногда препятствия размещаются в одном и том же положении, или они слишком близки.Случайно сгенерированные препятствия, иногда помещенные в то же положение

public void Randomize() 
{ 
    int random = rand.Next(1,200); 

    switch (random) 
    { 
     case 200: 
      if (Texture.crabrect.X < 0) 
       Texture.crabrect.X = rand.Next(1000,1500); 
      break; 
     case 12: 
      if (Texture.samosarect.X < 0) 
       Texture.samosarect.X = rand.Next(1000, 2000); 
      break; 
     case 10: 
      if (Texture.mirchirect.X < 0) 
       Texture.mirchirect.X = rand.Next(1800,3000); 
      break; 
     case 80: 
      if (Texture.mushroomrect.X < 0) 
       Texture.mushroomrect.X = rand.Next(1000, 2000); 
      break; 
     case 195: 
      if (Texture.laddoorect.X < 0) 
       Texture.laddoorect.X = rand.Next(1000, 2000); 
      break; 
     case 56: 
      if (Texture.stonerect.X < 0) 
       Texture.stonerect.X = rand.Next(1000, 2000); 
      break; 
     case 177: 
      if (Texture.cactusrect.X < 0) 
       Texture.cactusrect.X = rand.Next(1000, 2000); 
      break; 
    } 
} 
+0

Затем проверьте, есть ли еще один объект в месте, где вы хотите разместить препятствие, и повторите попытку, если это так. –

+1

@NicoSchertler вы правы, но если они не размещены в точном положении ... как один на 200, а другой на 210, то что делать? – pravin

+0

Проверьте, не пересекаются ли диапазоны текстур ('позиция' до' позиция + ширина'). Есть несколько случаев, которые вам нужно проверить (например, как 'p1', так и' p1 + w1' меньше, чем 'p2'. Тогда нет пересечения). –

ответ

3

Используйте формулу расстояния, чтобы увидеть, находятся ли два объекта близко друг к другу.

Ниже приведен пример использования класса Obstacle для упрощения.

public void Randomize() 
{ 
    int random = rand.Next(1,WIDTH); 
    thisObstacle = new Obstacle(); //Blah, make your obstacle. 
    thisObstacle.rect = new Rectangle(random, Y,WIDTH, HEIGHT); 

    foreach (Obstacle obstacle in obstacles) 
    { 
     //If less than 100 pixels distance, make the obstacle somewhere else 
     if (GetDistance(thisObstacle.rect, obstacle.rect) < 100) 
     { 
      Randomize(); 
      return; 
     } 
    } 
    //If we didn't get near an obstacle, place it 
     //Do whatever you do 
} 

private static double GetDistance(Rectangle point1, Rectangle point2) 
{ 
    //Get distance by using the pythagorean theorem 
    double a = (double)(point2.X - point1.X); 
    double b = (double)(point2.Y - point1.Y); 
    return Math.Sqrt(a * a + b * b); 
} 
2

Почему бы вам не поместить свои препятствия в движение?
Я имею в виду, вы рандомизировали положение первого препятствия, затем добавляете смещение по умолчанию, а затем производите случайную позицию для своего препятствия. Таким образом, вы уверены, что у вас не будет препятствий, расположенных на одном и том же месте, без проверки предыдущих препятствий.