C# 随机生成的障碍物有时放置在同一位置

C# 随机生成的障碍物有时放置在同一位置,c#,xna,procedural-generation,C#,Xna,Procedural Generation,下面的代码用于生成障碍物的随机位置。障碍物从右向左移动,所以我用它的x坐标向左移动。当障碍物到达屏幕左侧时,它会再次放置在某个随机位置。但这里的问题是,有时障碍物被放置在相同的位置,或者它们太近了 public void Randomize() { int random = rand.Next(1,200); switch (random) { case 200: if (Texture.crabrect.X <

下面的代码用于生成障碍物的随机位置。障碍物从右向左移动,所以我用它的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;
    } 
 }
public void Randomize()
{
int random=rand.Next(1200);
开关(随机)
{ 
案例200:
if(纹理.crabrect.X<0)
Texture.crabrect.X=rand.Next(10001500);
打破
案例12:
if(Texture.samosrect.X<0)
Texture.samosrect.X=rand.Next(10002000);
打破
案例10:
if(纹理、微晶体X<0)
Texture.mirchirect.X=rand.Next(18003000);
打破
案例80:
if(纹理.mushroomrect.X<0)
Texture.mushroomrect.X=rand.Next(10002000);
打破
案例195:
if(纹理等X<0)
Texture.laddoorect.X=rand.Next(10002000);
打破
案例56:
if(纹理stonerect.X<0)
Texture.stonerect.X=rand.Next(10002000);
打破
案例177:
if(Texture.cactustrect.X<0)
Texture.cactusrect.X=rand.Next(10002000);
打破
} 
}

使用距离公式查看两个对象是否彼此靠近

下面是一个例子,使用
障碍
类来简化事情

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);
}
public void Randomize()
{
int random=rand.Next(1,宽度);
这个障碍=新障碍();//诸如此类,制造你的障碍。
ThisBarrier.rect=新矩形(随机、Y、宽度、高度);
foreach(障碍物中的障碍物)
{
//如果距离小于100像素,则将障碍物放置在其他位置
if(GetDistance(thisBarrier.rect,barrier.rect)<100)
{
随机化();
返回;
}
}
//如果我们没有靠近障碍物,就把它放好
//你做什么就做什么
}
私有静态双GetDistance(矩形点1、矩形点2)
{
//用勾股定理求距离
double a=(double)(point2.X-point1.X);
double b=(double)(point2.Y-point1.Y);
返回Math.Sqrt(a*a+b*b);
}

使用距离公式查看两个对象是否彼此靠近

下面是一个例子,使用
障碍
类来简化事情

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);
}
public void Randomize()
{
int random=rand.Next(1,宽度);
这个障碍=新障碍();//诸如此类,制造你的障碍。
ThisBarrier.rect=新矩形(随机、Y、宽度、高度);
foreach(障碍物中的障碍物)
{
//如果距离小于100像素,则将障碍物放置在其他位置
if(GetDistance(thisBarrier.rect,barrier.rect)<100)
{
随机化();
返回;
}
}
//如果我们没有靠近障碍物,就把它放好
//你做什么就做什么
}
私有静态双GetDistance(矩形点1、矩形点2)
{
//用勾股定理求距离
double a=(double)(point2.X-point1.X);
double b=(double)(point2.Y-point1.Y);
返回Math.Sqrt(a*a+b*b);
}

为什么不在前进中设置障碍?

我的意思是,你随机化第一个障碍物的位置,然后你添加一个默认偏移,然后为你的障碍物随机化另一个位置。通过这种方式,您可以确保在不检查之前的障碍物的情况下,不会在同一位置设置任何障碍物。

为什么不将障碍物放在前进中?

我的意思是,你随机化第一个障碍物的位置,然后你添加一个默认偏移,然后为你的障碍物随机化另一个位置。这样你就可以确保在同一位置上不会有任何障碍物,不检查以前的障碍物。

然后检查你要放置障碍物的位置是否已经有另一个物体,如果是这样,请重试。@NicoSchertler你说得对,但如果它们没有放置在准确的位置……比如一个在200,另一个在210,那么该怎么办?检查纹理的范围是否正确(
position
position+width
)相交。有一些情况需要检查(例如
p1
p1+w1
都小于
p2
。显然没有相交)。然后检查你想放置障碍物的地点是否已经有另一个物体,如果是这样,请再试一次。@NicoSchertler你是对的,但如果它们没有放置在准确的位置……比如一个在200,另一个在210,那么该怎么办?检查纹理的范围(
位置
位置+宽度
)相交。有一些情况需要检查(例如
p1
p1+w1
都小于
p2
。那么显然没有相交)。