检测玩家是否与物体底部(矩形)发生碰撞

Detecting whether the player has collided w/ the bottom of an object (rectangles)

我正在尝试在 pygame 中创建鸟瞰图游戏(例如热线迈阿密)。我陷入了碰撞检测。我试图查看玩家是否击中了左侧、右侧、前方或后方的方块。我只做了 'in front' 碰撞,但这不起作用;玩家将击中方块 'head first',停止,但如果他按箭头键,则可以穿过方块。我知道问题出在哪里(在碰撞检测的 if else 语句中),但我终其一生都找不到解决方案。我尝试的一切似乎都不起作用。帮助!任何帮助将不胜感激,在此先感谢! (顺便说一句,这是我第一次遇到堆栈溢出问题,如果我没有很好地问这个问题,我很抱歉)(我删除了一些不必要的代码,如 pygame.init() 和变量)

def drawBlock(block_width,block_height,x,y):
    pygame.draw.rect(gameDisplay, red, [x,y,block_width,block_height])

def gameLoop(x,y):

    while not gameExit:


        level =  ["W","W","W","W","W","W","W","W","W","W","W","W",
                  "N","N","N","N","N","N","N","N","N","N","N","N","L",
                  "N","N","N","N","N","N","N","N","N","N","N","N","L",
                  "N","N","N","N","P","N","N","N","N","N","N","N","L",                                       
                  "N","N","N","N","N","N","N","N","N","N","N","N","L",                                     
                  "N","N","N","N","N","N","N","N","N","N","N","N","L",
                  "N","N","N","N","N","N","N","N","N","N","N","N","L",
                  "N","N","N","N","N","N","N","N","N","N","N","N","L",
                  "N","N","N","N","N","N","N","N","N","P","N","N","L",
                  "N","N","N","N","P","N","N","N","N","N","N","N","L",
                  "N","N","N","N","N","N","N","N","N","N","N","N","L","S"]    
#EVENT HANDLING

        for event in pygame.event.get():
            if event.type == pygame.KEYDOWN:
                if canMoveUp:
                    if event.key == pygame.K_UP:
                        y_change = -player_movement

                if canMoveDown:
                    if event.key == pygame.K_DOWN:
                        y_change = player_movement


                if event.key == pygame.K_LEFT:
                    x_change = -player_movement

                if event.key == pygame.K_RIGHT:
                    x_change = player_movement

            if event.type == pygame.KEYUP:
                if event.key == pygame.K_UP or event.key == pygame.K_DOWN: 
                    y_change = 0
                if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
                    x_change = 0

        pX += x_change
        pY += y_change

        gameDisplay.fill(black)


#CALCULATING THE SIZE OF THE BLOCKS SO THEY FIT W/ A VARIETY OF RESOLUTIONS


        if calculateBlockX:

            for element in level:
                if element == "W":
                    W_count += 1
                if element == "S":
                    block_width = (display_width/W_count) 
                    calculateBlockX = False

        if calculateBlockY:

            for element in level:
                if element == "L":
                    L_count += 1
                if element == "S":
                    block_height = (display_height/L_count)
                    calculateBlockY = False


#COUNTING HOW MANY BLOCKS THERE ARE IN THE LEVEL ARRAY (P)

        if P_countFunction:
            for element in level:
                if element == "P":
                    P_count += 1
                if element == "S":
                    print(P_count)
                    P_countFunction = False


#ALL THE X AND Ys OF ALL THE BLOCKS IN THE LEVEL, AND ACTUALLY DRAWING THEM

        blockXY = []

        for element in level:
            if element == "N":
                 x += block_width
            if element == "L":                                              
                 y += block_height
                 x = 0
            if element == "P": 
                drawBlock(block_width,block_height,x,y)                
                blockXY.append(x)
                blockXY.append(y)
                if appendBlockXY:
                    if len(collisionArray) > P_count:
                        del(collisionArray[P_count])
                        print(collisionArray)
                        appendBlockXY = False
                    collisionArray.append(blockXY)
                blockXY = []
                x += block_width
            if element == "S":
                y = 0

#COLLISION DETECTION              

        for XnY in collisionArray:

                if pX >= XnY[0] and pX <= XnY[0] + block_width and pY + playerSize <= XnY[1] or pX + playerSize >= XnY[0] and pX <= XnY[0] + block_width:

                    if pY - block_height == XnY[1]:
                        canMoveUp = False
                        y_change = 0

                    if pY - block_height != XnY[1]:
                        canMoveUp = True
                else:
                    if pY - block_height >= XnY[1]: 
                        canMoveUp = True



        #gameDisplay.blit(img,[pX,pY])

        pygame.draw.rect(gameDisplay, green, [pX,pY,playerSize,playerSize])

        clock.tick(60)

        pygame.display.update()


    pygame.quit()
    quit()

gameLoop(x,y)        

pygame.display.update()

您的碰撞检测是以允许最后一次迭代覆盖所有早期检查的方式编写的。取而代之的是,在循环之前将 canMoveUp 设置为 True,并且循环应该只将其设置为 False 或保留它。