def collide(sprite1, sprite2, collision_objects=None, original_pos=None):
# use default CollisionObjects?
if not collision_objects:
collision_objects = SATCollision.default_collision_objects
# do AABB first for a likely early out
# TODO: right now, we only have pygame.Rect anyway, so these are AABBs
if (sprite1.rect.right < sprite2.rect.left or sprite1.rect.bottom < sprite2.rect.top or
sprite2.rect.right < sprite1.rect.left or sprite2.rect.right < sprite1.rect.left):
return None
test = SATCollision.try_collide(sprite1, sprite2, collision_objects[0], False)
if not test:
return None
test = SATCollision.try_collide(sprite2, sprite1, collision_objects[1], True)
if not test:
return None
# pick the best collision from the two
ret = collision_objects[1] if collision_objects[1].magnitude < collision_objects[0].magnitude else collision_objects[0]
if not ret.is_collided:
return None
# fill in some more values in the recycled Collision object before returning it
ret.separate[0] = - ret.distance * ret.normal_x
ret.separate[1] = - ret.distance * ret.normal_y
if not original_pos:
original_pos = (sprite1.rect.x, sprite1.rect.y)
ret.original_pos = original_pos
return ret
评论列表
文章目录