Я предполагаю, что когда вы пишете спрайт, вы имеете в виду растровый спрайт, а не pygame.sprite.Sprite
.
Вероятно, лучше всего поддерживать спрайт в виде растрового изображения и прямоугольника, а затем всегда рисовать спрайт в его прямоугольнике, корректируя прямоугольник для изменения положения спрайта и используя его для любых коллизий.
Это можно легко сделать с помощью пар списков:
spike_image = pygame.image.load('spikes.png').convert_alpha()
spike_rect = spike_image.get_rect( )
spikes_a = [ spike_image, spike_rect( top_left=( 100, 100 ) )
spikes_b = [ spike_image, spike_rect( top_left=( 200, 200 ) )
# ...
screen.blit( spikes_a[0], spikes_a[1] )
screen.blit( spikes_b[0], spikes_b[1] )
# etc.
if ( spikes_a[1].colliderect( player_rect ) ):
print( "ouch!" )
Однако вам следует использовать правильный объект спрайта. Конечно, есть немного дополнительной настройки, но она многократно окупается простотой использования:
class Spike( pygame.sprite.Sprite ):
def __init__( self, position=( 0, 0 ) ):
self.image = pygame.image.load('spikes.png').convert_alpha()
self.rect = self.image.get_rect( top_left = position )
def moveTo( self, position ):
self.rect = self.image.get_rect( top_left = position )
def moveBy( self, dx, dy ):
self.rect.move_ip( dx, dy )
spike_a = Spike( ( 100, 100 ) )
spike_b = Spike( ( 200, 200 ) )
spike_a.draw( window ) # get this for free
Существует множество полезных функций групп и столкновений, связанных с использованием объектов Sprite, их стоит прочитать: https://www.pygame.org/docs/ref/sprite.html
person
Kingsley
schedule
02.12.2020