Как можно короче.
if ( sprite1.rect.colliderect( sprite2.rect ) ):
# TODO handle collision
Но для более полезного примера ...
Создайте глобальную группу спрайтов.Группа спрайтов позволяет коду выполнить простую проверку на наличие коллизий сразу для всей группы.Может быть полезны две группы, например: aliens
и bullets
, biscuits
и dips
.
SPRITES = pygame.sprite.Group()
Определить спрайт.Функция update()
спрайта вызывается в каждом кадре для выполнения всего , необходимого для выполнения спрайта между кадрами.Это может быть перемещение, изменение растрового изображения (для анимации) или проверка на наличие столкновений и т. Д. Этот спрайт имеет name
, поэтому мы можем распечатать, кто с кем сталкивается.
class RockSprite(pygame.sprite.Sprite):
def __init__(self, name, image, position):
pygame.sprite.Sprite.__init__(self)
self.name = name
self.image = image
self.rect = self.image.get_rect()
self.rect.center = position
def update(self):
# Move the sprite
# ... TODO
# Have we collided with any sprite?
hit_by = pygame.sprite.spritecollide( self, SPRITES, False )
hit_by.remove( self ) # other than ourselves
for other_sprite in hit_by:
print( "Sprite [%s] collided with [%s]" % ( self.name, other_sprite.name ) )
Создать группуспрайты.Здесь показано, как создать экземпляр RockSprite
и добавить его в группу SPRITE
.
# Make some sprites, including two that overlap (but it depends on the .png size)
sprite_image = pygame.image.load("rock.png").convert_alpha()
rock_01 = RockSprite( "rock01", sprite_image, (10, 10) )
rock_02 = RockSprite( "rock02", sprite_image, (15, 15) )
rock_03 = RockSprite( "rock03", sprite_image, (50, 50) )
# Add them to the global SPRITE group
SPRITES.add(rock_01)
SPRITES.add(rock_02)
SPRITES.add(rock_03)
Обязательно вызовите функцию группы спрайтов update()
в основном цикле:
while not done:
# Move the sprites (and checks for collisions) - calls update() on each member
SPRITES.update()
# paint he screen
# handle user input
...
Что дает полный демонстрационный код:
import pygame
WINDOW_WIDTH=400
WINDOW_HEIGHT=400
pygame.init()
WINDOW = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))
SPRITES = pygame.sprite.Group()
class RockSprite(pygame.sprite.Sprite):
def __init__(self, name, image, position):
pygame.sprite.Sprite.__init__(self)
self.name = name
self.image = image
self.rect = self.image.get_rect()
self.rect.center = position
def update(self):
# Move the sprite
# ... TODO
# Have we collided with any sprite?
hit_by = pygame.sprite.spritecollide( self, SPRITES, False )
hit_by.remove( self ) # other than ourselves
for other_sprite in hit_by:
print( "Sprite [%s] collided with [%s]" % ( self.name, other_sprite.name ) )
# Make some sprites, including two that overlap
sprite_image = pygame.image.load("rock.png").convert_alpha()
rock_01 = RockSprite( "rock01", sprite_image, (10, 10) )
rock_02 = RockSprite( "rock02", sprite_image, (15, 15) )
rock_03 = RockSprite( "rock03", sprite_image, (90, 90) )
# Add them to the global SPRITE group
SPRITES.add(rock_01)
SPRITES.add(rock_02)
SPRITES.add(rock_03)
clock = pygame.time.Clock()
done = False
while not done:
# Move the sprites (and checks for collisions)
SPRITES.update()
# Paint the screen
WINDOW.fill( ( 0,0,0 ) )
SPRITES.draw( WINDOW )
pygame.display.update()
pygame.display.flip()
# Check for user-events
for event in pygame.event.get():
if (event.type == pygame.QUIT):
done = True
clock.tick_busy_loop(60)