簡體   English   中英

碰撞檢測不適用於邊緣

[英]Collision Detection Not Working Around Edges

我幾乎完成了一個帶有迷宮牆的雙人坦克游戲,盡管有一個 bug 已經困擾了我很長時間了。 通常,用戶能夠將他們的水箱放置在其中一個迷宮牆的長邊的尖端並完全穿過牆,這使得顯示非常尷尬。 一般來說,使用 pygame 的.collidepoint函數進行碰撞檢測是有效的,盡管再一次,不是圍繞邊緣和頂點。 例如,當坦克開始穿過牆壁長邊的頂部時,錯誤就會出現: 在此處輸入圖片說明

我嘗試在.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) 

嘗試使用 pygame.draw.rect(screen, #Colour, [x, y, x, y]) 在你的邊界周圍創建一個矩形輪廓,如果坦克碰到它,運行代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM