diff --git a/arcade/sprite_list/collision.py b/arcade/sprite_list/collision.py index 193658674..2d89fdc9b 100644 --- a/arcade/sprite_list/collision.py +++ b/arcade/sprite_list/collision.py @@ -93,32 +93,36 @@ def _check_for_collision(sprite1: SpriteType, sprite2: SpriteType) -> bool: :returns: True if sprites overlap. :rtype: bool """ + + #NOTE: for speed becuase attribute look ups are slow. sprite1_position = sprite1._position sprite1_width = sprite1._width sprite1_height = sprite1._height sprite2_position = sprite2._position sprite2_width = sprite2._width sprite2_height = sprite2._height + radius_sum = ( (sprite1_width if sprite1_width > sprite1_height else sprite1_height) + (sprite2_width if sprite2_width > sprite2_height else sprite2_height) ) + # Multiply by half of the theoretical max diagonal length for an estimation of distance radius_sum *= 0.71 # 1.42 / 2 - radius_sum_x2 = radius_sum * radius_sum + radius_sum_sq = radius_sum * radius_sum diff_x = sprite1_position[0] - sprite2_position[0] - diff_x2 = diff_x * diff_x - if diff_x2 > radius_sum_x2: + diff_x_sq = diff_x * diff_x + if diff_x_sq > radius_sum_sq: return False diff_y = sprite1_position[1] - sprite2_position[1] - diff_y2 = diff_y * diff_y - if diff_y2 > radius_sum_x2: + diff_y_sq = diff_y * diff_y + if diff_y_sq > radius_sum_sq: return False - distance = diff_x2 + diff_y2 - if distance > radius_sum_x2: + distance = diff_x_sq + diff_y_sq + if distance > radius_sum_sq: return False return are_polygons_intersecting(