C++怪物漫游功能
我有一个工作的怪物系统,通过向玩家的2D X,Y位置移动一定距离来跟踪玩家 然而,我现在想让这些怪物以随机的时间间隔游荡一小段距离。假设我们有一个怪物可以以每秒200-300厘米的速度移动到任何地方 我需要知道如何准确地确定怪物的目标位置X,Y。目前我只需选择一个200-300之间的随机数,然后将这些值添加到怪物当前的X&Y值。尽管这样做有时会超过预期的行驶距离 我的问题是,如何在X,Y网格上选择一个距离当前位置一定距离的位置 这是我现在拥有的移动代码C++怪物漫游功能,c++,C++,我有一个工作的怪物系统,通过向玩家的2D X,Y位置移动一定距离来跟踪玩家 然而,我现在想让这些怪物以随机的时间间隔游荡一小段距离。假设我们有一个怪物可以以每秒200-300厘米的速度移动到任何地方 我需要知道如何准确地确定怪物的目标位置X,Y。目前我只需选择一个200-300之间的随机数,然后将这些值添加到怪物当前的X&Y值。尽管这样做有时会超过预期的行驶距离 我的问题是,如何在X,Y网格上选择一个距离当前位置一定距离的位置 这是我现在拥有的移动代码 // Determines
// Determines if position is changed via addition or subtraction.
const int positive_or_negative = RandomValueInRange_New(0, 1);
// Determines how much to move in each direction
const int x = RandomValueInRange(200, 300);
const int y = RandomValueInRange(200, 300);
if (positive_or_negative == 1)
{
location.Move(x, y);
}
else
{
location.Move(-x, -y);
}
这听起来像极坐标的工作。您想在给定的随机点的圆上拾取一个随机点,在一个范围半径内,然后将该点添加到怪物的当前位置:
// pick a random angle, in radians, between 0 and 2*pi
const double angle = ((double) RandomValueInRange(0, 628318)) / 100000.0;
// pick a random distance between min and max distance
const double radius = RandomValueInRange(200, 300);
// Convert polar co-ordinates to rectilinear co-ordinate deltas
const double dX = cos(angle)*radius;
const double dY = sin(angle)*radius;
// Add the rectilinear co-ordinates to your monster's position
location.Move(dX, dY);
这听起来像极坐标的工作。您想在给定的随机点的圆上拾取一个随机点,在一个范围半径内,然后将该点添加到怪物的当前位置:
// pick a random angle, in radians, between 0 and 2*pi
const double angle = ((double) RandomValueInRange(0, 628318)) / 100000.0;
// pick a random distance between min and max distance
const double radius = RandomValueInRange(200, 300);
// Convert polar co-ordinates to rectilinear co-ordinate deltas
const double dX = cos(angle)*radius;
const double dY = sin(angle)*radius;
// Add the rectilinear co-ordinates to your monster's position
location.Move(dX, dY);
您至少可以使用两种方法。您使用的方法将影响目标坐标的分布 第一,正如杰里米所说,是使用极坐标。r=200,300;ang=0,360。这导致r=200处的坐标密度高于r=300处的坐标密度,因为最大半径处的“环”比最小半径处的环具有50%以上的面积,这是由于其较大的环境 第二种方法是生成两个随机值x=random-300300;y=random-300300重复,直到随机对通过200和300之间距离的约束
int dX, dY, d2;
do {
dX = RandomValueInRange(-300, 300);
dY = RandomValueInRange(-300, 300);
d2 = dX*dX + dY*dY;
} while ( d2 < 200*200 || d2 > 300*300);
location.Move(dX, dY);
这会在空间中产生均匀分布,但代价是重复生成随机数。只有43.6%的随机对会落在所需区域中,因此在生成可接受的对之前,循环通常会执行2到3次
虽然这种分布在x-y空间中是均匀的,但在距离上却不均匀。一个怪物平均移动超过250厘米,因为在250厘米到300厘米之间的环比在200厘米到250厘米之间的环有更多的面积
更现实的移动分布将根据上一个移动偏移下一个移动。例如,做一个鬼脸可能是一个低概率事件。除非怪物主动守卫一个给定的位置,在这种情况下,它可能是最有可能的行动
没有更多关于怪物行为的细节,如果你不太关心分布情况,最简单的生成就是极坐标路径,它给出了两个随机数生成的合法位置,没有循环 您至少可以使用两种方法。您使用的方法将影响目标坐标的分布 第一,正如杰里米所说,是使用极坐标。r=200,300;ang=0,360。这导致r=200处的坐标密度高于r=300处的坐标密度,因为最大半径处的“环”比最小半径处的环具有50%以上的面积,这是由于其较大的环境 第二种方法是生成两个随机值x=random-300300;y=random-300300重复,直到随机对通过200和300之间距离的约束
int dX, dY, d2;
do {
dX = RandomValueInRange(-300, 300);
dY = RandomValueInRange(-300, 300);
d2 = dX*dX + dY*dY;
} while ( d2 < 200*200 || d2 > 300*300);
location.Move(dX, dY);
这会在空间中产生均匀分布,但代价是重复生成随机数。只有43.6%的随机对会落在所需区域中,因此在生成可接受的对之前,循环通常会执行2到3次
虽然这种分布在x-y空间中是均匀的,但在距离上却不均匀。一个怪物平均移动超过250厘米,因为在250厘米到300厘米之间的环比在200厘米到250厘米之间的环有更多的面积
更现实的移动分布将根据上一个移动偏移下一个移动。例如,做一个鬼脸可能是一个低概率事件。除非怪物主动守卫一个给定的位置,在这种情况下,它可能是最有可能的行动
没有更多关于怪物行为的细节,如果你不太关心分布情况,最简单的生成就是极坐标路径,它给出了两个随机数生成的合法位置,没有循环 这似乎更像是一个问题,而不是代码审查。您是否考虑过随机选取角度和距离,然后转换为X,Y?为什么您现在所做的不起作用?有什么问题吗?现在还不清楚你的目标与你现在的目标有什么不同。你不知道如何确定距离吗?毕达哥拉斯公式会有所帮助
在这种情况下,这似乎更像是一个所谓的问题,而不是代码审查。您是否考虑过随机选取角度和距离,然后转换为X,Y?为什么您现在所做的不起作用?有什么问题吗?现在还不清楚你的目标与你现在的目标有什么不同。你不知道如何确定距离吗?毕达哥拉斯公式在这种情况下会很有帮助。这正是我所需要的!非常感谢。正是我需要的!非常感谢。