程序检测碰撞,即使sprite没有字面上碰撞'pygame.sprite.collide_rect'

时间:2012-01-11 15:42:18

标签: python pygame collision sprite

我的目标是让我的程序能够在球精灵击中任何一个'g_ball'精灵时检测到碰撞。代码显然检测到碰撞,并且我有“print”语句来测试它......但是即使没有精灵正在触摸,它也会一直打印“进度”。这是代码:

while 1:
    screen.blit(background, (0,0))
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()


        if event.type == KEYDOWN:
            if event.key == K_a:
                m_x = -4
                s+=1
            elif event.key == K_d:
                m_x = +4
                s2+=1
        if event.type == KEYUP:
            if event.key == K_a:
                m_x = 0
            elif event.key == K_d:
                m_x = 0

    x+= m_x
    y+= m_y      

    ball = pygame.sprite.Sprite()
    ball.image = pygame.image.load('red_ball.png').convert()
    ball.rect = ball.image.get_rect()
    ball.image.set_colorkey((white))
    screen.blit(ball.image,(x,y))
    if x > 640:
        x = 0
    if x < 0:
        x = 640


    g_ball = pygame.sprite.Sprite()
    g_ball.image = pygame.image.load('green_ball.png').convert()
    g_ball.rect = g_ball.image.get_rect()
    g_ball.image.set_colorkey(white)
    screen.blit(g_ball.image,(50,t))
    t+=5
    if t > 521:
        t = 0
    collision = pygame.sprite.collide_rect(ball, g_ball)
    if collision == True:
        print ('PROGRESS!!!')

2 个答案:

答案 0 :(得分:0)

这是因为您没有为碰撞设置偏移,您只将偏移量传递给screen.blit

您的固定代码是:

...
ball.rect = ball.image.get_rect()
ball.rect.topleft = (x, y)
...
g_ball.rect = g_ball.image.get_rect()
g_ball.rect.topleft = (50, t)
...

答案 1 :(得分:0)

nightcracker是对的。你是否意识到你在这个循环中做了什么(应该尽可能快地运行)?您正在创建2个新球,您从高清加载图像,将它们放到(0,0),然后在屏幕上手动打印它们在给定位置。最后一部分意味着你在某个地方展示它们,但不是它们真正的位置(你确实用ball.rect = ball.image.get_rect()设置了它们的真实位置)。它们确实在(0,0),并且一直在碰撞。

你将它们blit到屏幕的方式并不好,你应该使用渲染器。无论如何,你应该先尝试一些教程,学习什么是Surface,什么是Sprite。小心放在主循环中的内容(为什么要一直创建新的球?它们可以在启动时创建一次),你的代码会更漂亮,你的FPS会增加