python - 在 Pygame 中,如何使 Sprite blitting 两次具有两个单独的碰撞盒?

标签 python pygame collision-detection collision blit

我不知道我的标题是否很清楚,所以我将尝试在这里更清楚地解释这一点。所以我在 Pygame 中有一个名为 spikes 的 Sprite。我希望有多个尖峰,所以我blit第二个。问题是,我的 spike_collision 框仅适用于我 blit 的第一个,而不适用于第二个。除了必须制作第二个碰撞盒之外,如何让第二个尖峰也拥有自己的碰撞盒?

这是blit代码:

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

这是碰撞盒代码:

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

谢谢。

最佳答案

我假设当你写“sprite”时,你指的是位图 Sprite ,而不是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!" )

但是,您应该使用“正确的” Sprite 对象。当然,有一些额外的设置,但它的返回是多次易用性:

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

关于python - 在 Pygame 中,如何使 Sprite blitting 两次具有两个单独的碰撞盒?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65099981/

相关文章:

python - pygame 在屏幕上显示变量不起作用

java - 2D 碰撞检测 LWJGL

python - 使用 keras 库指定 Dense

python - 获取日期作为数组

python - Ubuntu pygame获取event.key值

python - 如何检查包含 Sprite 的组是否为空

碰撞后 Swift 设置 isdynamic 为 false

android - 带碰撞检测的动画?

python - 如何在 Python 中进行简单的命令行聊天?

python - 如何检索分配给 Django 中的组的所有权限