【问题标题】:Collision Detection Not Working Around Edges碰撞检测不适用于边缘
【发布时间】:2020-01-12 15:59:40
【问题描述】:

我几乎已经完成了一场带有迷宫墙的决斗坦克游戏,尽管有一个 bug 已经困扰了我很长一段时间。通常,用户能够将他们的坦克放置在其中一个迷宫墙的长边的尖端并完全穿过墙,这使得展示非常尴尬。一般来说,使用 pygame 的 .collidepoint 函数的碰撞检测是有效的,但再一次,不是在边缘和顶点周围。例如,当坦克开始从墙的长边顶部移动时,这个 bug 就会出现:

我尝试在.collidepoint 函数的参数中使用各种and 语句,认为它可能只是检查一个坐标,尽管这显然也没有帮助。有谁知道导致这种情况发生的原因以及需要什么代码来确保在边缘周围正确检测到碰撞?这是我一直在尝试的:

  #FIRST TANK
        #if player moves left and isn't touching a wall
        if keys[pygame.K_LEFT] and tank.x > tank.vel and not barrier.collidepoint((tank.x, tank.y)) and not barrier2.collidepoint((tank.x,tank.y + 5)) and not barrier3.collidepoint((tank.x, tank.y and tank.y + 5)) and not barrier4.collidepoint((tank.x, tank.y +5)) and not barrier5.collidepoint((tank.x, tank.y +5)) and not barrier5.collidepoint((tank.x, tank.y +5))  and not barrier6.collidepoint((tank.x, tank.y +5))  and not barrier7.collidepoint((tank.x, tank.y +5))  and not barrier8.collidepoint((tank.x, tank.y +5))  and not barrier9.collidepoint((tank.x, tank.y +5))  and not barrier10.collidepoint((tank.x, tank.y +5))  and not barrier11.collidepoint((tank.x, tank.y +5))  and not barrier12.collidepoint((tank.x, tank.y +5))  and not barrier13.collidepoint((tank.x, tank.y +5))  and not barrier14.collidepoint((tank.x, tank.y +5))  and not barrier15.collidepoint((tank.x, tank.y +5))  and not barrier16.collidepoint((tank.x, tank.y +5))  and not barrier17.collidepoint((tank.x, tank.y +5))  and not barrier18.collidepoint((tank.x, tank.y +5))  and not barrier19.collidepoint((tank.x, tank.y +5))  and not barrier20.collidepoint((tank.x, tank.y +5))  and not barrier21.collidepoint((tank.x, tank.y +5))  and not barrier22.collidepoint((tank.x, tank.y +5))  and not barrier23.collidepoint((tank.x, tank.y +5))  and not barrier24.collidepoint((tank.x, tank.y +5))  and not barrier25.collidepoint((tank.x, tank.y +5))  and not barrier26.collidepoint((tank.x, tank.y +5))  and not barrier27.collidepoint((tank.x, tank.y +5))  and not barrier28.collidepoint((tank.x, tank.y +5))  and not barrier29.collidepoint((tank.x, tank.y +5))  and not barrier30.collidepoint((tank.x, tank.y +5))  and not barrier31.collidepoint((tank.x, tank.y +5))  and not barrier32.collidepoint((tank.x, tank.y +5))  and not barrier33.collidepoint((tank.x, tank.y +5))  and not barrier34.collidepoint((tank.x, tank.y +5))  and not barrier35.collidepoint((tank.x, tank.y +5))  and not barrier26.collidepoint((tank.x, tank.y +5)):
            tank.left = True
            tankImg = leftTank
            tank.x -= tank.vel
            direction = (-1, 0)

        #if player moves right and isn't touching a wall 
        if keys[pygame.K_RIGHT] and tank.x < 700 - tank.width and not barrier.collidepoint((tank.x + 18, tank.y + 15)) and not barrier3.collidepoint((tank.x + 20, tank.y and tank.y+15)) and not barrier4.collidepoint((tank.x + 12 and tank.x + 9, tank.y + 10)) and not barrier5.collidepoint((tank.x + 20, tank.y and tank.y+15)) and not barrier6.collidepoint((tank.x + 20, tank.y and tank.y+15)) and not barrier7.collidepoint((tank.x + 20, tank.y and tank.y+15)) and not barrier8.collidepoint((tank.x + 20, tank.y and tank.y+15)) and not barrier9.collidepoint((tank.x + 20, tank.y and tank.y+15)) and not barrier10.collidepoint((tank.x + 20, tank.y and tank.y+15)) and not barrier11.collidepoint((tank.x + 20, tank.y and tank.y+15)) and not barrier12.collidepoint((tank.x + 20, tank.y and tank.y+15)) and not barrier13.collidepoint((tank.x + 20, tank.y and tank.y+15)) and not barrier14.collidepoint((tank.x + 20, tank.y and tank.y+15)) and not barrier15.collidepoint((tank.x + 20, tank.y and tank.y+15)) and not barrier16.collidepoint((tank.x + 20, tank.y and tank.y+15)) and not barrier17.collidepoint((tank.x + 20, tank.y and tank.y+15)) and not barrier18.collidepoint((tank.x + 20, tank.y and tank.y+15)) and not barrier19.collidepoint((tank.x + 20, tank.y and tank.y+15)) and not barrier20.collidepoint((tank.x + 20, tank.y and tank.y+15)) and not barrier21.collidepoint((tank.x + 20, tank.y and tank.y+15)) and not barrier22.collidepoint((tank.x + 20, tank.y and tank.y+15)) and not barrier23.collidepoint((tank.x + 20, tank.y and tank.y+15)) and not barrier24.collidepoint((tank.x + 20, tank.y and tank.y+15)) and not barrier25.collidepoint((tank.x + 20, tank.y and tank.y+15)) and not barrier26.collidepoint((tank.x + 20, tank.y and tank.y+15)) and not barrier27.collidepoint((tank.x + 20, tank.y and tank.y+15)) and not barrier28.collidepoint((tank.x + 20, tank.y and tank.y+15)) and not barrier29.collidepoint((tank.x + 20, tank.y and tank.y+15)) and not barrier30.collidepoint((tank.x + 20, tank.y and tank.y+15)) and not barrier31.collidepoint((tank.x + 20, tank.y and tank.y+15)) and not barrier32.collidepoint((tank.x + 20, tank.y and tank.y+15)) and not barrier33.collidepoint((tank.x + 20, tank.y and tank.y+15)) and not barrier34.collidepoint((tank.x + 20, tank.y and tank.y+15)) and not barrier35.collidepoint((tank.x + 20, tank.y and tank.y+15)) and not barrier36.collidepoint((tank.x + 20, tank.y and tank.y+15)):

            tank.right = True
            tankImg = rightTank
            tank.x += tank.vel
            direction = (1, 0)

         #if player moves up and isn't touching a wall
        if keys[pygame.K_UP] and tank.y > tank.vel and not barrier.collidepoint((tank.x + 7, tank.y - 5)) and not barrier2.collidepoint((tank.x,tank.y - 5)) and not barrier3.collidepoint((tank.x + 3, tank.y)) and not barrier4.collidepoint((tank.x, tank.y)) and not barrier5.collidepoint((tank.x, tank.y)) and not barrier6.collidepoint((tank.x, tank.y)) and not barrier7.collidepoint((tank.x, tank.y)) and not barrier8.collidepoint((tank.x, tank.y)) and not barrier9.collidepoint((tank.x, tank.y)) and not barrier10.collidepoint((tank.x, tank.y)) and not barrier11.collidepoint((tank.x, tank.y)) and not barrier12.collidepoint((tank.x, tank.y)) and not barrier13.collidepoint((tank.x, tank.y)) and not barrier14.collidepoint((tank.x, tank.y)) and not barrier15.collidepoint((tank.x, tank.y)) and not barrier16.collidepoint((tank.x, tank.y)) and not barrier17.collidepoint((tank.x, tank.y)) and not barrier18.collidepoint((tank.x, tank.y)) and not barrier19.collidepoint((tank.x, tank.y)) and not barrier20.collidepoint((tank.x, tank.y)) and not barrier21.collidepoint((tank.x, tank.y)) and not barrier22.collidepoint((tank.x, tank.y)) and not barrier23.collidepoint((tank.x, tank.y)) and not barrier24.collidepoint((tank.x, tank.y)) and not barrier25.collidepoint((tank.x, tank.y)) and not barrier26.collidepoint((tank.x, tank.y)) and not barrier27.collidepoint((tank.x, tank.y)) and not barrier28.collidepoint((tank.x, tank.y)) and not barrier29.collidepoint((tank.x, tank.y)) and not barrier30.collidepoint((tank.x, tank.y)) and not barrier31.collidepoint((tank.x, tank.y)) and not barrier32.collidepoint((tank.x, tank.y)) and not barrier33.collidepoint((tank.x, tank.y)) and not barrier34.collidepoint((tank.x, tank.y)) and not barrier35.collidepoint((tank.x, tank.y)) and not barrier36.collidepoint((tank.x, tank.y)):
            tank.up = True
            tankImg = upTank
            tank.y -= tank.vel
            direction = (0, -1) #move in ascending direction


        #if player moves down and isn't touching a wall:    
        if keys[pygame.K_DOWN] and tank.y < 700 - tank.height and not barrier2.collidepoint((tank.x, tank.y + 20)) and not barrier3.collidepoint((tank.x and tank.x -5, tank.y and tank.y + 20))and not barrier4.collidepoint((tank.x, tank.y + 20 )) and not barrier5.collidepoint((((tank.x, tank.y)) )) and not barrier6.collidepoint((((tank.x, tank.y)) )) and not barrier7.collidepoint((((tank.x, tank.y)) )) and not barrier8.collidepoint((((tank.x, tank.y)) )) and not barrier9.collidepoint((((tank.x, tank.y)) )) and not barrier10.collidepoint((((tank.x, tank.y)) )) and not barrier11.collidepoint((((tank.x, tank.y)) )) and not barrier12.collidepoint((((tank.x, tank.y)) )) and not barrier13.collidepoint((((tank.x, tank.y)) )) and not barrier14.collidepoint((((tank.x, tank.y)) )) and not barrier15.collidepoint((((tank.x, tank.y)) )) and not barrier16.collidepoint((((tank.x, tank.y)) )) and not barrier17.collidepoint((((tank.x, tank.y)) )) and not barrier18.collidepoint((((tank.x, tank.y)) )) and not barrier19.collidepoint((((tank.x, tank.y)) )) and not barrier20.collidepoint((((tank.x, tank.y)) )) and not barrier21.collidepoint((((tank.x, tank.y)) )) and not barrier22.collidepoint((((tank.x, tank.y)) )) and not barrier23.collidepoint((((tank.x, tank.y)) )) and not barrier24.collidepoint((((tank.x, tank.y)) )) and not barrier25.collidepoint((((tank.x, tank.y)) )) and not barrier26.collidepoint((((tank.x, tank.y)) )) and not barrier27.collidepoint((((tank.x, tank.y)) )) and not barrier28.collidepoint((((tank.x, tank.y)) )) and not barrier29.collidepoint((((tank.x, tank.y)) )) and not barrier30.collidepoint((((tank.x, tank.y)) )) and not barrier31.collidepoint((((tank.x, tank.y)) )) and not barrier32.collidepoint((((tank.x, tank.y)) )) and not barrier33.collidepoint((((tank.x, tank.y)) )) and not barrier34.collidepoint((((tank.x, tank.y)) )) and not barrier35.collidepoint((((tank.x, tank.y)) )) and not barrier36.collidepoint((((tank.x, tank.y)) )):             
            tank.down = True #get image of tank facing down
            tankImg = downTank
            tank.y += tank.vel #move at velocity
            direction = (0, 1) #move in a descending direction


        #SECOND TANK    
        if keys[pygame.K_a] and tank2.x > tank2.vel and not barrier.collidepoint((tank2.x, tank2.y)) and not barrier2.collidepoint((tank2.x,tank2.y + 5)) and not barrier3.collidepoint((tank2.x, tank2.y and tank2.y + 5)) and not barrier4.collidepoint((((tank.x, tank.y)))) and not barrier5.collidepoint((((tank.x, tank.y)))) and not barrier5.collidepoint((((tank.x, tank.y))))  and not barrier6.collidepoint((((tank.x, tank.y))))  and not barrier7.collidepoint((((tank.x, tank.y))))  and not barrier8.collidepoint((((tank.x, tank.y))))  and not barrier9.collidepoint((((tank.x, tank.y))))  and not barrier10.collidepoint((((tank.x, tank.y))))  and not barrier11.collidepoint((((tank.x, tank.y))))  and not barrier12.collidepoint((((tank.x, tank.y))))  and not barrier13.collidepoint((((tank.x, tank.y))))  and not barrier14.collidepoint((((tank.x, tank.y))))  and not barrier15.collidepoint((((tank.x, tank.y))))  and not barrier16.collidepoint((((tank.x, tank.y))))  and not barrier17.collidepoint((((tank.x, tank.y))))  and not barrier18.collidepoint((((tank.x, tank.y))))  and not barrier19.collidepoint((((tank.x, tank.y))))  and not barrier20.collidepoint((((tank.x, tank.y))))  and not barrier21.collidepoint((((tank.x, tank.y))))  and not barrier22.collidepoint((((tank.x, tank.y))))  and not barrier23.collidepoint((((tank.x, tank.y))))  and not barrier24.collidepoint((((tank.x, tank.y))))  and not barrier25.collidepoint((((tank.x, tank.y))))  and not barrier26.collidepoint((((tank.x, tank.y))))  and not barrier27.collidepoint((((tank.x, tank.y))))  and not barrier28.collidepoint((((tank.x, tank.y))))  and not barrier29.collidepoint((((tank.x, tank.y))))  and not barrier30.collidepoint((((tank.x, tank.y))))  and not barrier31.collidepoint((((tank.x, tank.y))))  and not barrier32.collidepoint((((tank.x, tank.y))))  and not barrier33.collidepoint((((tank.x, tank.y))))  and not barrier34.collidepoint((((tank.x, tank.y))))  and not barrier35.collidepoint((((tank.x, tank.y))))  and not barrier26.collidepoint((((tank.x, tank.y)))):
            tank2.left = True
            tank2.down = False
            tank2.up = False
            tank2Img = leftTank2
            tank2.x -= tank2.vel
            direction2 = (-1, 0)
        if keys[pygame.K_d] and tank2.x < 700 - tank2.width and not barrier.collidepoint((tank2.x + 18, tank2.y + 15)) and not barrier3.collidepoint((tank2.x + 20, tank2.y and tank2.y+15)) and not barrier4.collidepoint((tank2.x + 12 and tank2.x + 9, tank2.y + 10)) and not barrier5.collidepoint((tank2.x + 20, tank2.y and tank2.y+15)) and not barrier6.collidepoint((tank2.x + 20, tank2.y and tank2.y+15)) and not barrier7.collidepoint((tank2.x + 20, tank2.y and tank2.y+15)) and not barrier8.collidepoint((tank2.x + 20, tank2.y and tank2.y+15)) and not barrier9.collidepoint((tank2.x + 20, tank2.y and tank2.y+15)) and not barrier10.collidepoint((tank2.x + 20, tank2.y and tank2.y+15)) and not barrier11.collidepoint((tank2.x + 20, tank2.y and tank2.y+15)) and not barrier12.collidepoint((tank2.x + 20, tank2.y and tank2.y+15)) and not barrier13.collidepoint((tank2.x + 20, tank2.y and tank2.y+15)) and not barrier14.collidepoint((tank2.x + 20, tank2.y and tank2.y+15)) and not barrier15.collidepoint((tank2.x + 20, tank2.y and tank2.y+15)) and not barrier16.collidepoint((tank2.x + 20, tank2.y and tank2.y+15)) and not barrier17.collidepoint((tank2.x + 20, tank2.y and tank2.y+15)) and not barrier18.collidepoint((tank2.x + 20, tank2.y and tank2.y+15)) and not barrier19.collidepoint((tank2.x + 20, tank2.y and tank2.y+15)) and not barrier20.collidepoint((tank2.x + 20, tank2.y and tank2.y+15)) and not barrier21.collidepoint((tank2.x + 20, tank2.y and tank2.y+15)) and not barrier22.collidepoint((tank2.x + 20, tank2.y and tank2.y+15)) and not barrier23.collidepoint((tank2.x + 20, tank2.y and tank2.y+15)) and not barrier24.collidepoint((tank2.x + 20, tank2.y and tank2.y+15)) and not barrier25.collidepoint((tank2.x + 20, tank2.y and tank2.y+15)) and not barrier26.collidepoint((tank2.x + 20, tank2.y and tank2.y+15)) and not barrier27.collidepoint((tank2.x + 20, tank2.y and tank2.y+15)) and not barrier28.collidepoint((tank2.x + 20, tank2.y and tank2.y+15)) and not barrier29.collidepoint((tank2.x + 20, tank2.y and tank2.y+15)) and not barrier30.collidepoint((tank2.x + 20, tank2.y and tank2.y+15)) and not barrier31.collidepoint((tank2.x + 20, tank2.y and tank2.y+15)) and not barrier32.collidepoint((tank2.x + 20, tank2.y and tank2.y+15)) and not barrier33.collidepoint((tank2.x + 20, tank2.y and tank2.y+15)) and not barrier34.collidepoint((tank2.x + 20, tank2.y and tank2.y+15)) and not barrier35.collidepoint((tank2.x + 20, tank2.y and tank2.y+15)) and not barrier36.collidepoint((tank2.x + 20, tank2.y and tank2.y+15)):
            tank2.right = True
            tank2.left = False
            tank2.down = False
            tank2Img = rightTank2
            tank2.x += tank2.vel
            direction2 = (1,0)
        if keys[pygame.K_w] and tank2.y > tank.vel and not barrier.collidepoint((tank2.x  + 7, tank2.y - 5)) and not barrier2.collidepoint((tank2.x ,tank2.y - 5)) and not barrier3.collidepoint((tank2.x  + 3, tank2.y)) and not barrier4.collidepoint((tank.x, tank.y)) and not barrier5.collidepoint((tank.x, tank.y)) and not barrier6.collidepoint((tank.x, tank.y)) and not barrier7.collidepoint((tank.x, tank.y)) and not barrier8.collidepoint((tank.x, tank.y)) and not barrier9.collidepoint((tank.x, tank.y)) and not barrier10.collidepoint((tank.x, tank.y)) and not barrier11.collidepoint((tank.x, tank.y)) and not barrier12.collidepoint((tank.x, tank.y)) and not barrier13.collidepoint((tank.x, tank.y)) and not barrier14.collidepoint((tank.x, tank.y)) and not barrier15.collidepoint((tank.x, tank.y)) and not barrier16.collidepoint((tank.x, tank.y)) and not barrier17.collidepoint((tank.x, tank.y)) and not barrier18.collidepoint((tank.x, tank.y)) and not barrier19.collidepoint((tank.x, tank.y)) and not barrier20.collidepoint((tank.x, tank.y)) and not barrier21.collidepoint((tank.x, tank.y)) and not barrier22.collidepoint((tank.x, tank.y)) and not barrier23.collidepoint((tank.x, tank.y)) and not barrier24.collidepoint((tank.x, tank.y)) and not barrier25.collidepoint((tank.x, tank.y)) and not barrier26.collidepoint((tank.x, tank.y)) and not barrier27.collidepoint((tank.x, tank.y)) and not barrier28.collidepoint((tank.x, tank.y)) and not barrier29.collidepoint((tank.x, tank.y)) and not barrier30.collidepoint((tank.x, tank.y)) and not barrier31.collidepoint((tank.x, tank.y)) and not barrier32.collidepoint((tank.x, tank.y)) and not barrier33.collidepoint((tank.x, tank.y)) and not barrier34.collidepoint((tank.x, tank.y)) and not barrier35.collidepoint((tank.x, tank.y)) and not barrier36.collidepoint((tank.x, tank.y)):
            tank2.up = True
            tank2.right = False
            tank2.left = False           
            tank2Img = upTank2
            tank2.y -= tank2.vel
            direction2 = (0, -1)
        if keys[pygame.K_s] and tank2.y < 700 - tank.height and not barrier2.collidepoint((tank2.x, tank2.y + 20)) and not barrier3.collidepoint((tank2.x and tank2.x -5, tank2.y and tank2.y + 20))and not barrier4.collidepoint((tank2.x, tank2.y + 20 )) and not barrier5.collidepoint(tank.x, tank.y)) and not barrier6.collidepoint(tank.x, tank.y)) and not barrier7.collidepoint(tank.x, tank.y)) and not barrier8.collidepoint(tank.x, tank.y)) and not barrier9.collidepoint(tank.x, tank.y)) and not barrier10.collidepoint(tank.x, tank.y)) and not barrier11.collidepoint(tank.x, tank.y)) and not barrier12.collidepoint(tank.x, tank.y)) and not barrier13.collidepoint(tank.x, tank.y)) and not barrier14.collidepoint(tank.x, tank.y)) and not barrier15.collidepoint(tank.x, tank.y)) and not barrier16.collidepoint(tank.x, tank.y)) and not barrier17.collidepoint(tank.x, tank.y)) and not barrier18.collidepoint(tank.x, tank.y)) and not barrier19.collidepoint(tank.x, tank.y)) and not barrier20.collidepoint(tank.x, tank.y)) and not barrier21.collidepoint(tank.x, tank.y)) and not barrier22.collidepoint(tank.x, tank.y)) and not barrier23.collidepoint(tank.x, tank.y)) and not barrier24.collidepoint(tank.x, tank.y)) and not barrier25.collidepoint(tank.x, tank.y)) and not barrier26.collidepoint(tank.x, tank.y)) and not barrier27.collidepoint(tank.x, tank.y)) and not barrier28.collidepoint(tank.x, tank.y)) and not barrier29.collidepoint(tank.x, tank.y)) and not barrier30.collidepoint(tank.x, tank.y)) and not barrier31.collidepoint(tank.x, tank.y)) and not barrier32.collidepoint(tank.x, tank.y)) and not barrier33.collidepoint(tank.x, tank.y)) and not barrier34.collidepoint(tank.x, tank.y)) and not barrier35.collidepoint(tank.x, tank.y)) and not barrier36.collidepoint(tank.x, tank.y)): 
            tank2.down = True
            tank2.right = False
            tank2.left = False             
            tank2Img = downTank2
            tank2.y += tank2.vel
            direction2 = (0, 1) 

【问题讨论】:

    标签: python python-3.x animation pygame


    【解决方案1】:

    尝试使用 pygame.draw.rect(screen, #Colour, [x, y, x, y]) 在边框周围创建一个矩形轮廓,如果坦克碰到它,运行代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-10
      • 1970-01-01
      • 2015-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多