Python Pygame-检测矩形的哪一侧与另一侧碰撞

Python Pygame-检测矩形的哪一侧与另一侧碰撞,python,pygame,collision,Python,Pygame,Collision,大家好 我正在用Python和Pygame制作一个超级马里奥兄弟的克隆游戏,我编写了一个函数,如果两个矩形发生碰撞,则返回True,否则返回False。所以我知道当马里奥与怪物相撞时如何检测。现在,我想知道马里奥是否跳过了怪物,或者换句话说,它的矩形在怪物矩形的顶部相撞。我该怎么做?这是我的密码: 两个矩形碰撞检测功能: def is_colliding(x, y, w, h, x2, y2, w2, h2): if x < x2 + w2 and x + w > x2 an

大家好 我正在用Python和Pygame制作一个超级马里奥兄弟的克隆游戏,我编写了一个函数,如果两个矩形发生碰撞,则返回True,否则返回False。所以我知道当马里奥与怪物相撞时如何检测。现在,我想知道马里奥是否跳过了怪物,或者换句话说,它的矩形在怪物矩形的顶部相撞。我该怎么做?这是我的密码:

两个矩形碰撞检测功能:

def is_colliding(x, y, w, h, x2, y2, w2, h2):
    if x < x2 + w2 and x + w > x2 and y < y2 + h2 and h + y > y2:
        return True
    return False

感谢您的帮助。谢谢。

解决这个问题的一种方法是计算“运动方向” 例如,您可以保存上一步的坐标,如果在当前步骤中是“碰撞”返回True,并且上一步中的马里奥在怪物下方,而在上一步中是“碰撞”返回False,则您可以确定马里奥从上方坠落

# x1,y1,h1,w1 - mario params
# x2,y2,h2,w2 - monster params
# y1_prev - mario previous param
# y2_prev - monster prevoius param
# collide_prev - previous sollision check

def check_above(x1, y1, w1, h1, x2, y2, w2, h2, y1_prev, y2_prev, collide_prev):
    collide = is_colliding(x1, y1, w1, h1, x2, y2, w2, h2)
    if collide and y2_prev + h2 < y1_prev and not collide_prev:
        return True
    else:
        return False 
#x1,y1,h1,w1-马里奥参数
#x2,y2,h2,w2-怪物参数
#y1_上一个-马里奥上一个参数
#y2_prev-怪物prevoius参数
#碰撞前-上一次溶解检查
上面的def检查(x1、y1、w1、h1、x2、y2、w2、h2、y1上一个、y2上一个、碰撞上一个):
碰撞=正在碰撞(x1,y1,w1,h1,x2,y2,w2,h2)
如果碰撞和y2_prev+h2
逻辑很简单,如果在当前步骤中马里奥正在碰撞,而在前一步骤中两者都没有碰撞,并且马里奥在怪物上方,那么这意味着马里奥从上方碰撞

注意
如果x坐标是矩形的左下角,代码就可以运行了

谢谢你的回答,但是当我调用函数时,y1_prev、y2_prev和collide_prev的参数应该是什么?y1_prev、y2_prev和collide_prev是上一个游戏步骤的坐标。例如,您的马里奥以每次1像素的速度向右移动,当前x=10。然后在下一次(时间+1),马里奥坐标将变为x=x+1,因此它将是11。对于这个例子x1=11和x1_prev=10,我理解,但如何在实际代码中实现这一点?这取决于您的应用程序逻辑。在大多数情况下,都有类似于“stage”的内容,您可以在循环中更新该“stage”中对象的坐标。
# x1,y1,h1,w1 - mario params
# x2,y2,h2,w2 - monster params
# y1_prev - mario previous param
# y2_prev - monster prevoius param
# collide_prev - previous sollision check

def check_above(x1, y1, w1, h1, x2, y2, w2, h2, y1_prev, y2_prev, collide_prev):
    collide = is_colliding(x1, y1, w1, h1, x2, y2, w2, h2)
    if collide and y2_prev + h2 < y1_prev and not collide_prev:
        return True
    else:
        return False