C# 随机生成的障碍物有时放置在同一位置
下面的代码用于生成障碍物的随机位置。障碍物从右向左移动,所以我用它的x坐标向左移动。当障碍物到达屏幕左侧时,它会再次放置在某个随机位置。但这里的问题是,有时障碍物被放置在相同的位置,或者它们太近了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 <
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
。那么显然没有相交)。