大家好! 我正在使用Python和Pygame制作超级马里奥兄弟克隆游戏,并且编写了一个函数,如果两个矩形发生碰撞,则返回True,否则返回False。因此,我知道如何检测马里奥何时与怪物发生碰撞。现在,我想知道马里奥(Mario)是否跳过了怪物,或者换句话说,它正好在怪物rect的顶部碰撞。我怎么做?这是我的代码:
两个矩形碰撞检测功能:
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
在主游戏循环中对其进行的实际检查:
while True:
# other stuff
if is_colliding(mario.x, mario.y, mario.w, mario.h, goomba1.x, goomba1.y, goomba1.w, goomba1.h):
goomba1.wounded()
感谢您的帮助。谢谢。
答案 0 :(得分:1)
解决问题的一种方法是计算“运动方向” 例如,您可以保存先前步骤的坐标,如果在当前步骤中is_colliding返回True,并且上一步中的马里奥在怪物下方,而在上一步中is_colliding返回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
如果在当前步骤中马里奥发生碰撞,而先前两者都不发生碰撞并且马里奥处于怪物上方,则逻辑很简单,这意味着马里奥从上方发生碰撞。
注意 如果x坐标是矩形的左下角,该代码将起作用