Pygame随机地形产卵

时间:2015-04-08 20:21:49

标签: python pygame sprite terrain

我正在尝试创建一个游戏,其中100个岩石随机分散在一系列大的坐标中。问题是有时岩石可能相互重叠。我想出的解决方案是检查岩石是否相互重叠,如果它们相互重叠,则一次又一次地为岩石创建新的随机生成坐标,直到它与任何东西发生碰撞。我不完全确定如何做到这一点;我已经尝试过检测摇滚和摇滚名单之间的碰撞,但最终发生的一切都是它认为它与自身发生碰撞并且总是返回True。 __init__函数使用random.randint(-2500,2500)生成坐标。当在for循环中创建岩石时,每个岩石都会添加到列表中。在更新功能中,它检查岩石之间的矩形碰撞。我怎样才能解决这个问题?谢谢,非常感谢答案。问我是否需要更多信息。

1 个答案:

答案 0 :(得分: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([])

当然这段代码可能会产生错误(它是一个相当简单的代码)并且它需要一些优化,但我认为你可能会从中获得一般的意识形态。

抱歉我的英文