如何让 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
我不知道我的标题是否很清楚,所以我将在这里尝试更清楚地解释这一点。所以我在 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