Skip to content

Commit ab1e929

Browse files
authored
Merge pull request #3209 from aatle/sprite-collision
Rewrite sprite collision functions
2 parents d836ecf + e099866 commit ab1e929

File tree

1 file changed

+24
-46
lines changed

1 file changed

+24
-46
lines changed

src_py/sprite.py

Lines changed: 24 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -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

17421727
def 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

17781759
def 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

Comments
 (0)