python pygame遮罩碰撞

问题描述 投票:-1回答:1

当我尝试使用这段代码时,它仅适用于1个对象,而不适用于每个对象。我正在尝试修改此视频(https://www.youtube.com/watch?v=Idu8XfwKUao)中的代码。有没有更简单的方法来获得结果?。如果有,请让我知道

#part of code that doesn't matter
randomx = [100,400,300]
randomy = [100,0,300]
green_blob = pygame.image.load("greenblob-59x51.png").convert_alpha()
orange_blob = pygame.image.load("orangeblob-59x51.png").convert_alpha()
blob_mask = pygame.mask.from_surface(green_blob)
blob_color = green_blob
obstacle = []
obstacle_mask = []
oy = []
ox = []
for i in range(4):
    obstacle.append(pygame.image.load("obstacle-400x399.png").convert_alpha())
    obstacle_mask.append(pygame.mask.from_surface(obstacle[i]))
    ox.append(random.choice(randomx))
    oy.append(random.choice(randomy))
# main loop
while True:
    events()
    for i in range(4):
        mx, my = pygame.mouse.get_pos()

        offset = ((mx - int(ox[i]))), ((my - int(oy[i])))
        result = obstacle_mask[i].overlap(blob_mask, offset)
        if result:
            blob_color = orange_blob
        else:
            blob_color = green_blob
        screen.blit(obstacle[i], (ox[i], oy[i]))
        screen.blit(blob_color, (mx, my))



    pygame.display.update()
    CLOCK.tick(FPS)
    screen.fill(BLACK)
python pygame mask
1个回答
0
投票

您的应用程序运行正常。问题是,overlap的每个评估结果都会导致blob_color发生变化。因此,循环中的最后一个障碍“获胜”。如果最后一个障碍overlaps是斑点,则颜色为orange_blob,否则为green_blob。在循环之前设置绿色。如果有任何障碍overlaps,则将其更改为橙色。循环后必须绘制一次斑点。例如:

while True:
    events()

    blob_color = green_blob
    for i in range(4):
        mx, my = pygame.mouse.get_pos()

        offset = (int(mx - ox[i]), int(my - oy[i]))
        if obstacle_mask[i].overlap(blob_mask, offset):
            blob_color = orange_blob

        screen.blit(obstacle[i], (ox[i], oy[i]))

    screen.blit(blob_color, (mx, my))


要在不重叠的随机位置找到障碍物,必须评估是否有新障碍物撞到了先前的障碍物。创建一个随机位置:

x, y = random.randint(100, 400), random.randint(100, 400)

并评估any是否有阻碍any成为新位置的障碍。

overlap

如果是这种情况,请重复该过程。创建一个新的随机位置并测试重叠:

isect = any(obstacle_mask[j].overlap(obstacle_mask[i], (x-ox[j], y-oy[j])) for j in range(i))
© www.soinside.com 2019 - 2024. All rights reserved.