如何让 Sprite blitting 两次在 Pygame 中有两个独立的碰撞框?

How do you make a Sprite blitting twice have two separate collision boxes in Pygame?

我不知道我的标题是否很清楚,所以我将在这里尝试更清楚地解释这一点。所以我在 Pygame 中有一个名为 spikes 的 Sprite。我想要不止一个 spikes 所以我 blit 第二个。问题是,我的 spike_collision 框只适用于我 blit 的第一个,而不适用于第二个。除了必须制作第二个碰撞盒,我怎样才能让第二个 spikes 也有自己的碰撞盒?

这是 blit 代码:

        screen.blit(spikes, (spike_x, 500 - player_y + 476))
        screen.blit(spikes, (spike_x + 200, 500 - player_y + 476))

这是 collision-box 代码:

spike_collision = spikes.get_rect(topleft=(spike_x, 500 - player_y + 476))

谢谢。

我假设当你写“精灵”时,你指的是位图精灵,而不是 pygame.sprite.Sprite

最好将 sprite 维护为位图 一个矩形,然后始终在其矩形处绘制 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