@@ -1707,36 +1707,21 @@ def spritecollide(sprite, group, dokill, collided=None):
17071707 which will be used to calculate the collision.
17081708
17091709 """
1710- # pull the default collision function in as a local variable outside
1711- # the loop as this makes the loop run faster
1712- default_sprite_collide_func = sprite .rect .colliderect
1713-
1714- if dokill :
1715- crashed = []
1716- append = crashed .append
1717-
1718- for group_sprite in group .sprites ():
1719- if collided is not None :
1720- if collided (sprite , group_sprite ):
1721- group_sprite .kill ()
1722- append (group_sprite )
1723- else :
1724- if default_sprite_collide_func (group_sprite .rect ):
1725- group_sprite .kill ()
1726- append (group_sprite )
1727-
1728- return crashed
1729-
17301710 if collided is not None :
1731- return [
1711+ collided_sprites = [
17321712 group_sprite for group_sprite in group if collided (sprite , group_sprite )
17331713 ]
1734-
1735- return [
1736- group_sprite
1737- for group_sprite in group
1738- if default_sprite_collide_func (group_sprite .rect )
1739- ]
1714+ else :
1715+ sprite_rect_collide = sprite .rect .colliderect
1716+ collided_sprites = [
1717+ group_sprite
1718+ for group_sprite in group
1719+ if sprite_rect_collide (group_sprite .rect )
1720+ ]
1721+ if dokill :
1722+ for group_sprite in collided_sprites :
1723+ group_sprite .kill ()
1724+ return collided_sprites
17401725
17411726
17421727def groupcollide (groupa , groupb , dokilla , dokillb , collided = None ):
@@ -1757,22 +1742,18 @@ def groupcollide(groupa, groupb, dokilla, dokillb, collided=None):
17571742 that will be used to calculate the collision.
17581743
17591744 """
1760- crashed = {}
1745+ collided_sprites = {}
17611746 # pull the collision function in as a local variable outside
17621747 # the loop as this makes the loop run faster
17631748 sprite_collide_func = spritecollide
1749+ for group_a_sprite in groupa :
1750+ collisions = sprite_collide_func (group_a_sprite , groupb , dokillb , collided )
1751+ if collisions :
1752+ collided_sprites [group_a_sprite ] = collisions
17641753 if dokilla :
1765- for group_a_sprite in groupa .sprites ():
1766- collision = sprite_collide_func (group_a_sprite , groupb , dokillb , collided )
1767- if collision :
1768- crashed [group_a_sprite ] = collision
1769- group_a_sprite .kill ()
1770- else :
1771- for group_a_sprite in groupa :
1772- collision = sprite_collide_func (group_a_sprite , groupb , dokillb , collided )
1773- if collision :
1774- crashed [group_a_sprite ] = collision
1775- return crashed
1754+ for group_a_sprite in collided_sprites :
1755+ group_a_sprite .kill ()
1756+ return collided_sprites
17761757
17771758
17781759def spritecollideany (sprite , group , collided = None ):
@@ -1793,19 +1774,16 @@ def spritecollideany(sprite, group, collided=None):
17931774 sprites must have a "rect" value, which is a rectangle of the sprite area,
17941775 which will be used to calculate the collision.
17951776
1796-
17971777 """
1798- # pull the default collision function in as a local variable outside
1799- # the loop as this makes the loop run faster
1800- default_sprite_collide_func = sprite .rect .colliderect
1801-
18021778 if collided is not None :
18031779 for group_sprite in group :
18041780 if collided (sprite , group_sprite ):
18051781 return group_sprite
18061782 else :
1807- # Special case old behaviour for speed.
1783+ # pull the default collision function in as a local variable outside
1784+ # the loop as this makes the loop run faster
1785+ sprite_rect_collide = sprite .rect .colliderect
18081786 for group_sprite in group :
1809- if default_sprite_collide_func (group_sprite .rect ):
1787+ if sprite_rect_collide (group_sprite .rect ):
18101788 return group_sprite
18111789 return None
0 commit comments