Обнаружение столкновения не работает вокруг краев - PullRequest
0 голосов
/ 12 января 2020

Я почти закончил танковую игру для дуэльных игроков со стенами лабиринта, хотя есть одна ошибка, которая беспокоит меня уже довольно давно. Часто пользователь может расположить свой резервуар на конце длинного края одной из стен лабиринта и полностью пройти сквозь стену go, что делает его довольно неудобным. В общем, обнаружение столкновений с помощью функции .collidepoint в Pygame работает, хотя и еще раз, а не вокруг ребер и вершин. Вот как выглядит ошибка, например, когда танк начинает двигаться через верхний край длинной стены: enter image description here

Я пытался использовать различные and операторы в параметрах функции .collidepoint, полагая, что, возможно, она проверяет только одну координату, хотя это тоже явно не помогло. Кто-нибудь знает, что является причиной этого и какой код необходим, чтобы обеспечить правильное обнаружение столкновения по краям? Вот что я пытался:

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

1 Ответ

0 голосов
/ 12 января 2020

Попробуйте создать прямоугольный контур вокруг вашей границы с помощью pygame.draw.rect (screen, #Colour, [x, y, x, y]), и, если танк коснется этого, запустите код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...