Pygame 命中框相互碰撞检查列表只检查列表中的最后一个框
Pygame collision checking lists of hit boxes against each other only checks the last box in the list
我正在 pygame
编写游戏代码,我的实体对象具有命中框的属性列表。
所有的命中框都是 pygame.rect
对象,当我将它们绘制在屏幕上时,它们都会显示出来,但由于某些原因,只有当列表中的最后一个命中框发生碰撞时,这些对象才会表现得像它们发生碰撞一样与其他对象列表中的最后一个命中框。
这是我用来检查的方法:
def collide_check(self, obj):
self.update_hit_boxes()
obj.update_hit_boxes()
is_collide = False
if self.can_collide and obj.can_collide:
for box in self.hit_boxes:
for obj_box in obj.hit_boxes:
is_collide = box.colliderect(obj_box)
if is_collide:
break
else:
is_collide = False
return is_collide
任何人都知道我在这里做错了什么,或者仅使用 pygame.rect
个对象和 pygame.rect.collide_rect
是否有可能做到这一点?
我无法测试它,但问题可能是因为 break
只能退出 last/inner for
-loop - 所以代码仍然运行外部 for
-loop可以重新设置is_collide = False
(因为它运行is_collide = box.colliderect(obj_box)
)。最后它只有在最后一个盒子发生碰撞时才会得到 is_collide = True
。
你应该在不赋值给变量的情况下检查碰撞,并且只在 if`
内部赋值变量
if box.colliderect(obj_box):
is_collide = True
break
而不是
is_collide = box.colliderect(obj_box)
if is_collide:
break
Ot 将两个 for
循环放在单独的函数中并使用 return True
而不是 break
def test(obj1, obj2):
for box1 in obj1.hit_boxes:
for obj2 in obj2.hit_boxes:
if box1.colliderect(box2):
return True
return False
def collide_check(self, obj):
self.update_hit_boxes()
obj.update_hit_boxes()
is_collide = False
if self.can_collide and obj.can_collide:
is_collide = test(self, obj)
return is_collide
编辑:
你可以直接在原函数中使用return
def collide_check(self, obj):
self.update_hit_boxes()
obj.update_hit_boxes()
if self.can_collide and obj.can_collide:
for box in self.hit_boxes:
for obj_box in obj.hit_boxes:
if box.colliderect(obj_box):
return True
return False
我正在 pygame
编写游戏代码,我的实体对象具有命中框的属性列表。
所有的命中框都是 pygame.rect
对象,当我将它们绘制在屏幕上时,它们都会显示出来,但由于某些原因,只有当列表中的最后一个命中框发生碰撞时,这些对象才会表现得像它们发生碰撞一样与其他对象列表中的最后一个命中框。
这是我用来检查的方法:
def collide_check(self, obj):
self.update_hit_boxes()
obj.update_hit_boxes()
is_collide = False
if self.can_collide and obj.can_collide:
for box in self.hit_boxes:
for obj_box in obj.hit_boxes:
is_collide = box.colliderect(obj_box)
if is_collide:
break
else:
is_collide = False
return is_collide
任何人都知道我在这里做错了什么,或者仅使用 pygame.rect
个对象和 pygame.rect.collide_rect
是否有可能做到这一点?
我无法测试它,但问题可能是因为 break
只能退出 last/inner for
-loop - 所以代码仍然运行外部 for
-loop可以重新设置is_collide = False
(因为它运行is_collide = box.colliderect(obj_box)
)。最后它只有在最后一个盒子发生碰撞时才会得到 is_collide = True
。
你应该在不赋值给变量的情况下检查碰撞,并且只在 if`
内部赋值变量 if box.colliderect(obj_box):
is_collide = True
break
而不是
is_collide = box.colliderect(obj_box)
if is_collide:
break
Ot 将两个 for
循环放在单独的函数中并使用 return True
而不是 break
def test(obj1, obj2):
for box1 in obj1.hit_boxes:
for obj2 in obj2.hit_boxes:
if box1.colliderect(box2):
return True
return False
def collide_check(self, obj):
self.update_hit_boxes()
obj.update_hit_boxes()
is_collide = False
if self.can_collide and obj.can_collide:
is_collide = test(self, obj)
return is_collide
编辑:
你可以直接在原函数中使用return
def collide_check(self, obj):
self.update_hit_boxes()
obj.update_hit_boxes()
if self.can_collide and obj.can_collide:
for box in self.hit_boxes:
for obj_box in obj.hit_boxes:
if box.colliderect(obj_box):
return True
return False