简体   繁体   中英

Collision Detection Not Working Around Edges

I have nearly finished a duel-player tank game with maze walls, though there is one bug which has been bothering me for quite some time now. Oftentimes the user is able to position their tank at the tip of the long edge of one of the maze walls and go through the wall entirely, which makes for quite an awkward display. In general, the collision detection with pygame's .collidepoint function is working, though once more, not around edges and vertices. This is what the bug appears like, for example, when the tank begins to move through the top of the wall's long edge: 在此处输入图片说明

I've tried to use various and statements in the parameters of the .collidepoint function, thinking that perhaps it was only checking for one coordinate, though that clearly did not help either. Does anyone know what is causing this to occur and what code is needed to ensure the collision is properly detected around the edges? Here is what I have been trying:

  #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) 

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM