Pygame物体和矩形的碰撞检测

3

是的,我又要问关于这个程序的问题:D

无论如何,我目前有一个程序,在屏幕上创建了两条带有间隙的线,可以滚动。从这里开始,我显然需要看看这两个对象是否发生碰撞。由于我只有一个精灵和一个矩形,所以我认为制作两个类对它们来说有点多余和过度。然而,我只能找到与类相关的教程,这显然是我不需要的。因此,我的问题实际上是: 是否可以测试标准图像和Pygame rect之间的碰撞?如果不行,我该如何转换图像、矩形或两个精灵来实现这一点。(最好都不使用类。)

注意:图像和矩形是以下方式创建的(如果有区别)

bird = pygame.image.load("bird.png").convert_alpha()
pipeTop = pygame.draw.rect(screen, (0,200,30), Rect((scrollx,0),(30,height)))
pipeBottom = pygame.draw.rect(screen, (0,200,30), Rect((scrollx,900),(30,-bheight)))
2个回答

3

单独的图像没有位置。你不能测试一个矩形和没有放置在世界中的对象之间的碰撞。我建议创建一个名为Bird的类,以及一个名为Pipe的类,它们都将是pygame.Sprite的子类。

Pygame已经内置了碰撞检测。

以下是一个简短的示例:

bird = Bird()
pipes = pygame.Group()
pipes.add(pipeTop)
pipes.add(pipeBottom)

while True:    
    if pygame.sprite.spritecollide(bird,pipes):
        print "Game Over"

编辑:

不要害怕类,迟早都会用到它们的。 如果你真的不想使用精灵,你可以使用鸟的矩形和管子,调用collide_rect来检查它们是否重叠。

编辑2:

从pygame文档修改的一个示例鸟类。

class Bird(pygame.sprite.Sprite):
    def __init__(self):
       pygame.sprite.Sprite.__init__(self)

       self.image = pygame.image.load("bird.png").convert_alpha()

       # Fetch the rectangle object that has the dimensions of the image
       # Update the position of this object by setting the values of rect.x and rect.y
       self.rect = self.image.get_rect()

您可以添加诸如move等方法,该方法将使用重力作用将鸟向下移动。

对于Pipe也是同样的道理,但不同的是,您可以创建一个空表面,并将其填充为一种颜色,而不是加载图像。

image = pygame.Surface(width,height)
image.fill((0,200,30)

我应该在Bird类中放什么来使它成为精灵?另外,你能解释一下pygame.Sprite子类的部分吗?谢谢! - Harvey

1

您可以获取x和y的值并进行比较:

if pipe.x < bird.x < pipe.x+pipe.width:
    #collision code
    pass

我相信这就是我最终采取的方式。 - Harvey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接