Pygame碰撞检测对象和rect

时间:2014-03-03 19:10:39

标签: python pygame collision-detection

是的,我在问这个节目的另一个问题: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 个答案:

答案 0 :(得分:3)

图像本身没有位置。你无法测试一个rect与世界上没有放置的东西之间的碰撞。我建议创建一个类Bird以及一个类管道,它将子类化为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"

编辑:

不要害怕上课,迟早不得不使用它们。 如果你真的不想使用精灵,可以使用bird rect和pipe并调用collide_rect来检查它们是否重叠。

EDIT2:

从pygame docs

修改的Bird类示例
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()

然后你可以添加诸如移动之类的方法,这将使用重力移动鸟。

同样适用于Pipe,但您可以创建一个空的Surface,而不是加载图片,并用颜色填充它。

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

答案 1 :(得分:1)

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

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