python pygame 掩码碰撞
python pygame mask collision
当我尝试使用这段代码时,它只适用于 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)
您的应用程序运行良好。问题是,overlap
的每次评估结果都会导致 blob_color
的变化。所以循环中的最后一个障碍"wins"。如果最后一个障碍overlaps
是blob,那么颜色就是orange_blob
,否则就是green_blob
.
在循环之前设置绿色。如果有任何障碍 overlaps
blob,则将其更改为橙色。 blob 必须在循环后绘制一次。例如:
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
个障碍 overlap
作为新位置。
isect = any(obstacle_mask[j].overlap(obstacle_mask[i], (x-ox[j], y-oy[j])) for j in range(i))
如果是这样,则重复该过程。创建一个新的随机位置并测试重叠:
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]))
isect = True
while isect:
x, y = random.randint(100, 400), random.randint(100, 400)
isect = any(obstacle_mask[j].overlap(obstacle_mask[i], (x-ox[j], y-oy[j])) for j in range(i))
ox.append(x)
oy.append(y)
当我尝试使用这段代码时,它只适用于 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)
您的应用程序运行良好。问题是,overlap
的每次评估结果都会导致 blob_color
的变化。所以循环中的最后一个障碍"wins"。如果最后一个障碍overlaps
是blob,那么颜色就是orange_blob
,否则就是green_blob
.
在循环之前设置绿色。如果有任何障碍 overlaps
blob,则将其更改为橙色。 blob 必须在循环后绘制一次。例如:
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
个障碍 overlap
作为新位置。
isect = any(obstacle_mask[j].overlap(obstacle_mask[i], (x-ox[j], y-oy[j])) for j in range(i))
如果是这样,则重复该过程。创建一个新的随机位置并测试重叠:
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]))
isect = True
while isect:
x, y = random.randint(100, 400), random.randint(100, 400)
isect = any(obstacle_mask[j].overlap(obstacle_mask[i], (x-ox[j], y-oy[j])) for j in range(i))
ox.append(x)
oy.append(y)