随机生成对象的算法
Algorithm to spawn objects randomly
所以我正在制作一个单板滑雪游戏,当玩家骑行时,我希望地形随机生成。现在,我使用这个代码:
void Biome::draw()
{
srand(seed); // seed is generated elsewhere
for (int x = 0; x < maxObstAmount; x++)
{
int xLoc = rand() % 640;
int yLoc = rand() % 480;
int obst = rand()%obstsInBiome.size();
obstsInBiome[obst].drawObstacle(xLoc, yLoc);
}
}
该功能选择生物群落中的随机障碍物,并在屏幕上的随机位置产生它,这基本上就是我想要的。然而,这会导致对象重叠等等,所以我只是想知道是否有人能帮我想出一个更好的算法来生成它们,这样它们就不会重叠?感谢
您可以预先计算出可以在不重叠的情况下生成新对象的区域,并使用该区域生成新对象位置。
编辑:
以下是一个算法的描述,我会在你描述的场景中使用:
我正在用x-y地理来描绘这样的东西。其中o
是有问题的对象。C
是创建范围。
|--------------------------------------------------------------------------------
| o o
| o o
|o o <-- Player moves this direction
^ | o o o
| | o o
y |--------------------------------------------------------------------------------
C x-->
如果每个x位置只有一个对象,那么问题就相当微不足道了。在上图中,相邻的o
是在y方向上具有大小的对象。
这是第二张清晰描绘单个对象的图:
|--------------------------------------------------------------------------------
| 7 3
| 5 1
|9 4 <-- Player moves this direction
^ | 6 4 2
| | 8 2
y |--------------------------------------------------------------------------------
C x-->
- 生成您的第一个对象
- 在上一个对象未占用的区域中生成下一个对象
- 根据需要重复步骤2
如果每个x位置可以有多个对象,或者对象在x方向上有一定宽度:
|--------------------------------------------------------------------------------
| o o
| o o
|o oooo <-- Player moves this direction
^ | o ooo
| | o ooo
y |--------------------------------------------------------------------------------
C x-->
或
|--------------------------------------------------------------------------------
| 7 3
| 7 5 1
| 7 4444 <-- Player moves this direction
^ | 88 6 222
| | 88 222
y |--------------------------------------------------------------------------------
C x-->
你的重叠问题变得有点难以追踪,但它仍然可以控制。
- 生成您的第一个对象
- 检查对象,从上一个对象开始,直到第一个没有干扰或跨越创建范围
C
的维度的对象,并从创建新对象的位置选择池中消除它们占用的空间 - 重复步骤2
为了详细说明步骤,我将举一个例子:
|--------------------------------------------------------------------------------
|
11|1
11|1 <-- Player moves this direction
^ |
| |
y |--------------------------------------------------------------------------------
C x-->
假设我们有这个场景,我们已经创建了object 1
,这个对象只有三分之一在视图中,但我们可以看到,如果我们在这个对象进入视图之前创建另一个对象,这将是有问题的。为了避免重叠,我们可以选择一个随机的位置和宽度,该位置和宽度可以存在于object 1
上方或下方的空间中。以下是一个有效的选择:
|--------------------------------------------------------------------------------
|
1|11
1|11 <-- Player moves this direction
^ |
| 22 |
y |--------------------------------------------------------------------------------
C x-->
接下来的场景可能是这样的:
|--------------------------------------------------------------------------------
| 33
| 33 111
4|4 111 <-- Player moves this direction
^ 4|4 22
| |
y |--------------------------------------------------------------------------------
C x-->
您可能不想将object 5
放置在绘制object 4
的位置,但对象3
、2
和1
此时已不需要考虑。因此,您可以根据创建的最后一个对象4
(可能还有3
,这取决于您如何设置游戏)检查算法,并相应地设置创建限制。
当然,这是一个简化的版本控制,我想你会给自己更多的空间来创建这些对象。我希望这说明了一种算法,可以解决你遇到的问题。
- 算法不适用于非常量对象的const_iterator
- 在 stl 算法中使用函数对象
- 排序算法,使用模板按内部数据对对象进行排序
- 在现有数据结构上使用BGL算法需要什么(边和顶点作为矢量<对象*>)?
- 分类算法和对象指针的问题
- 找到多组对象的最佳匹配的算法
- 为对象向量实现快速排序算法
- 使用sort()算法C 排序对象列表
- OpenCV对象在训练级联后检测算法会冻结
- 如何为涉及对象成员、间接寻址和强制转换的排序算法实现lambda函数
- 将排序算法与对象类合并
- 构建JSON对象的算法
- 是否可以混合使用虚拟函数和函数对象以使用标准算法
- 建议一个合适的算法来合并包含类对象的两个数组(不重复)
- 随机生成对象的算法
- 通过引用将函数对象传递到 std 算法中
- c++:应用于向量的STL算法也适用于其他容器对象
- 在对象(C++)的指针向量上使用STL算法
- C++对对象的向量进行迭代,并将STL算法应用于成员变量
- 是二维动态对象 O(n^2) 碰撞的最快算法