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

Python 检测玩家是否与物体底部(矩形)发生碰撞,python,pygame,collision,Python,Pygame,Collision,我正在尝试在pygame中创建一个鸟瞰游戏(例如热线迈阿密)。我在碰撞检测上被卡住了。我试着看看球员是在左边、右边、前面还是后面击中了一个方块。我只能做“前面”的碰撞,但那不起作用;玩家将“头朝前”击打拦网,停止,但如果他射出箭头键,则可以在拦网中移动。我知道问题是什么(在碰撞检测中的if-else语句中),但我一生都找不到解决方案。我尝试过的一切似乎都不起作用。救命啊!任何帮助都将不胜感激,提前谢谢!(顺便说一句,这是我第一次讨论堆栈溢出,如果我没有很好地回答这个问题,那么很抱歉)(我删除了一

我正在尝试在pygame中创建一个鸟瞰游戏(例如热线迈阿密)。我在碰撞检测上被卡住了。我试着看看球员是在左边、右边、前面还是后面击中了一个方块。我只能做“前面”的碰撞,但那不起作用;玩家将“头朝前”击打拦网,停止,但如果他射出箭头键,则可以在拦网中移动。我知道问题是什么(在碰撞检测中的if-else语句中),但我一生都找不到解决方案。我尝试过的一切似乎都不起作用。救命啊!任何帮助都将不胜感激,提前谢谢!(顺便说一句,这是我第一次讨论堆栈溢出,如果我没有很好地回答这个问题,那么很抱歉)(我删除了一些不必要的代码,比如pygame.init()和变量)

def绘图块(块宽、块高、x、y):
pygame.draw.rect(游戏显示,红色,[x,y,方块宽度,方块高度])
def gameLoop(x,y):
不退出游戏时:
级别=[“W”、“W”、“W”、“W”、“W”、“W”、“W”、“W”、“W”、“W”、“W”、“W”、“W”、“W”、“W”、“W”、“W”,
“N”、“N”、“N”、“N”、“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”、“N”、“N”、“N”、“N”、“L”,
“N”、“N”、“N”、“N”、“P”、“N”、“N”、“N”、“N”、“N”、“N”、“N”、“N”、“N”、“L”,
“N”、“N”、“N”、“N”、“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”、“N”、“N”、“N”、“N”、“L”,
“N”、“N”、“N”、“N”、“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”、“N”、“N”、“N”、“N”、“L”,
“N”、“N”、“N”、“N”、“N”、“N”、“N”、“N”、“N”、“N”、“N”、“P”、“N”、“N”、“N”、“L”,
“N”、“N”、“N”、“N”、“P”、“N”、“N”、“N”、“N”、“N”、“N”、“N”、“N”、“N”、“L”,
“N”、“N”、“N”、“N”、“N”、“N”、“N”、“N”、“N”、“N”、“N”、“N”、“N”、“N”、“N”、“N”、“L”、“S”]
#事件处理
对于pygame.event.get()中的事件:
如果event.type==pygame.KEYDOWN:
如果可以向上移动:
如果event.key==pygame.K_UP:
y_变化=-玩家移动
如果可以向下移动:
如果event.key==pygame.K_向下:
y_变化=玩家的移动
如果event.key==pygame.K_左:
x_变化=-玩家移动
如果event.key==pygame.K_RIGHT:
x_变化=玩家的移动
如果event.type==pygame.KEYUP:
如果event.key==pygame.K_向上或event.key==pygame.K_向下:
y_变化=0
如果event.key==pygame.K_左或event.key==pygame.K_右:
x_变化=0
pX+=x_变化
pY+=y_变化
游戏显示。填充(黑色)
#计算块的大小,使其适合各种分辨率
如果是calculateBlockX:
对于级别中的元素:
如果元素==“W”:
W_计数+=1
如果元素==“S”:
块宽度=(显示宽度/带计数)
calculateBlockX=False
如果是calculateBlockY:
对于级别中的元素:
如果元素==“L”:
L_计数+=1
如果元素==“S”:
块高度=(显示高度/L计数)
calculateBlockY=False
#计算级别数组中有多少块(P)
如果P_计数函数:
对于级别中的元素:
如果元素==“P”:
P_计数+=1
如果元素==“S”:
打印(P_计数)
P_countFunction=False
#标高中所有块的所有X和Y,并实际绘制它们
块状=[]
对于级别中的元素:
如果元素==“N”:
x+=块宽度
如果元素==“L”:
y+=块体高度
x=0
如果元素==“P”:
图块(图块宽度、图块高度、x、y)
blockXY.append(x)
blockXY.append(y)
如果是块状:
如果len(碰撞数组)>P_计数:
del(冲突数组[P_计数])
打印(冲突数组)
appendbox=False
collisionArray.append(块)
块状=[]
x+=块宽度
如果元素==“S”:
y=0
#碰撞检测
对于collisionArray中的XnY:

如果pX>=XnY[0]且pX您的冲突检测以允许最后一次迭代覆盖所有早期检查的方式写入。取而代之的是,在循环之前将
canMoveUp
设置为
True
,循环应该只将其设置为
False
或不设置它。

在所有代码行中添加4个空格-因此使用此空格识别代码并突出显示它。您好,欢迎来到stackoverflow。请阅读如何创建我们可以使用的。当然,并非所有代码都与错误/问题相关。相信我,如果你只是粘贴所有内容,没有人会阅读你的问题。哦,对了,我只是想人们可能需要查看整个代码,但我会编辑掉不必要的内容。顺便说一句,谢谢你修复代码块!顺便说一句:pygame有
pygame.Rect
类,并使用它进行碰撞检测-
pygame.Rect.colliderect
,等等。并且
Rect
有字段
-它是
x+宽度
-所以你不必做
XnY[0]+块宽度
pY+playerSize
哦,我当然明白你的意思了。。。终于成功了!!!非常感谢你,你不知道这对我有多大帮助我已经在这个问题上纠缠了好几天了再次感谢!
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()