2013-10-24 50 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

檢查紋理的範圍('position'到'position + width')是否相交。有幾種情況需要檢查(例如'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

爲什麼不把障礙放在進程中?
我的意思是,你隨機化第一個障礙物的位置,然後你添加一個默認偏移量,然後隨機化你的障礙物的另一個位置。通過這種方式,您可以確保在沒有檢查之前的障礙物的情況下,您不會在相同位置放置任何障礙物。