【问题标题】:Pygame Random Terrain SpawningPygame 随机地形生成
【发布时间】:2015-04-08 20:21:48
【问题描述】:

我正在尝试创建一个游戏,其中 100 块石头随机散布在大量坐标中。问题是有时岩石可能会相互重叠。我想出的解决方案是检查岩石是否相互重叠,如果重叠,则一次又一次地为岩石创建新的随机生成坐标,直到它没有碰撞。我不完全确定如何做到这一点;我已经尝试检测岩石和岩石列表之间的碰撞,但最终发生的只是它认为它与自身发生碰撞并始终返回为 True。 __init__ 函数使用random.randint(-2500,2500) 生成坐标。当在 for 循环中创建岩石时,每个岩石都被添加到列表中。在更新函数中,它检查岩石之间的矩形碰撞。我怎样才能解决这个问题?谢谢,将不胜感激。如果您需要更多信息,请询问我。

【问题讨论】:

  • 在将新岩石的坐标添加到岩石列表之前,能否检查与岩石列表的碰撞?
  • 只有当项目位于完全相同的坐标时才会发生碰撞,还是必须检查矩形/多边形重叠?如果是后者,所有项目的大小都相同吗?
  • 我不是要测试非重复点,我遇到的问题是整个矩形不能重叠。
  • 一般的解决方案还是先生成一个有效点的列表,然后从中选择,假设生成比重复检查便宜。那么所有的矩形都一样大吗?

标签: python pygame sprite terrain


【解决方案1】:

嗯,我想有几种方法可以解决这个问题:

1) 第一个是您已经使用过的,每次生成岩石时都会检查碰撞,如果存在碰撞,您将重新生成给定岩石的位置

2) 第二个是将你的“领域”切成岩石大小的矩形,就像一个瓷砖地图,因此创建一个可能的位置列表,如下所示:

possible_positions = [(i, j) for i in range(x_size_field//x_size_rock) for j in range(y_size_field//y_size_rock)]
for i in range(n_of_rocks):
    rock_pos = random.choice(possible_positions)
    possible_positions.remove(rock_pos)

但这种方法会牵涉到一组给定的可能位置,从而形成“均匀”的岩石分布

3) 因此,如果真的有必要将石头放在绝对随机的位置上,您可以创建一个可能的位置列表,如下所示:

possible_positions = [[(i, j) for j in range(y_size_field-y_size_rock)] for i in range(x_size_field-x_size_rock)]
for i in range(n_of_rocks):
    # X and Y represente positions on the list not on the field
    x = random.randint(0, len(possible_positions))
    y = random.randint(0, len(possible_positions[x]))

    # The rock positions
    rock_pos = possible_positions[x][y]

    # Now we remove the positions on the region of the new rock
    for i in range(x,x+x_size_rock):
        possible_positions[i] = possible_positions[i][0:y] + possible_positions[i][y+y_size_rock:-1]

    if [] in possible_positions:
        possible_positions.remove([])

当然,这段代码可能会产生错误(它是一个相当简单的代码),它需要一些优化,但我想你可以从中得到一般的想法。

对不起我的英语

【讨论】:

  • 我完全明白你想说什么。最初,我打算为游戏实现一个瓦片地图,现在我仍然可以,但仅限于岩石和沙子等地形。我肯定会尝试这个想法,看看它是否有效,而不是我目前所拥有的。
猜你喜欢
  • 2022-07-02
  • 1970-01-01
  • 1970-01-01
  • 2015-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-22
相关资源
最近更新 更多