首页 > 解决方案 > 如何使对象永不重叠?

问题描述

我正在尝试在 pygame 中制作汽车游戏,但是每当我尝试生成汽车时,其中一些汽车会相互重叠,我该如何解决?

下面是生成汽车的代码:

        if len(enemiesL) == 0:
            if len(enemiesR) == 0:
                wavelengthL += 3
            for _ in range(wavelengthL):
                enemy = EnemyL(random.randrange(160, Width/2 - 50), random.randrange(-1500, -100), random.choice(["black", "blue", "brown", "darkblue", "orange", "pale", "purple", "red", "white", "yellow"]))
                enemiesL.append(enemy)
        
        if len(enemiesR) == 0:
            wavelengthR += 3
            for _ in range(wavelengthR):
                enemy = EnemyR(random.randrange(Width/2, Width-200), random.randrange(-1500, -100), random.choice(["black", "blue", "brown", "darkblue", "orange", "pale", "purple", "red", "white", "yellow"]))
                enemiesR.append(enemy)

标签: pythonpython-3.xpygame

解决方案


创建一个随机位置并评估泰国位置的新车是否与任何其他汽车重叠。如果汽车重叠,则丢弃该位置。使用pygame.Rect对象并colliderect()评估汽车是否重叠。
下面假设汽车的位置为 ( enmey.x, enemy.y),汽车的大小为 ( enemy_width, enemy_height):

for _ in range(wavelengthL):
    while True:
        x, y = random.randrange(160, Width/2 - 50), random.randrange(-1500, -100)
    
        new_rect = pygame.Rect(x, y, enemy_width, enemy_height)
        if not any(enmey for enmey in enemiesL if new_rect.colliderect(enmey.x, enmey.y, enemy_width, enemy_height)):
            break
    
    enemy = EnemyL(x, y, random.choice(["black", "blue", "brown", "darkblue", "orange", "pale", "purple", "red", "white", "yellow"]))
    enemiesL.append(enemy)
for _ in range(wavelengthR):
    while True:
        x, y = random.randrange(Width/2, Width-200), random.randrange(-1500, -100)

        new_rect = pygame.Rect(x, y, enemy_width, enemy_height)
        if not any(enmey for enmey in enemiesR if new_rect.colliderect(enmey.x, enmey.y, enemy_width, enemy_height)):
            break

    enemy = EnemyR(x, y, random.choice(["black", "blue", "brown", "darkblue", "orange", "pale", "purple", "red", "white", "yellow"]))
    enemiesR.append(enemy)

推荐阅读