【问题标题】:Program detecting collision even though sprites aren't literally colliding 'pygame.sprite.collide_rect'即使精灵没有真正碰撞“pygame.sprite.collide_rect”,程序也会检测碰撞
【发布时间】:2012-01-11 15:42:17
【问题描述】:

我的目标是让我的程序能够在球精灵撞击任何一个“g_ball”精灵时检测到碰撞。代码明显检测到碰撞,我有“打印”语句来测试它……但即使没有任何精灵接触,它也会不断地打印“进度”。代码如下:

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!!!')

【问题讨论】:

    标签: python pygame collision sprite


    【解决方案1】:

    这是因为你没有为碰撞设置偏移量,你只将偏移量传递给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)
    ...
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-04
        • 2022-01-21
        • 1970-01-01
        相关资源
        最近更新 更多