Pygame Zero中Actor.top属性不生效?为何上下边界出界检测失效
问题根因
- 分支结构设计错误:当前代码把四个方向的越界判断串在了同一条
if-elif分支链上。if-elif链的执行逻辑是,只要前面任意一个条件命中,后续所有分支都会直接跳过、不再执行。比如当角色往右移动碰到右边界,触发了横向第一个判断后,后面关于上下边界的两个检测根本不会运行,自然起不到限制作用。这也是为什么左右方向的限制看起来能生效——它排在分支链最前面,只要触发就会执行,但排在后面的上下检测,永远会在横向条件命中时被直接跳过。 - 上下方向的判断逻辑完全写反:
下边界检测部分,代码判断Tesbold.top >= HEIGHT就将top值设为HEIGHT。但Tesbold.top是角色矩形上边缘的y坐标,只有角色完全跑到窗口下方、上边缘都超过窗口总高度时,这个条件才会触发;正常角色往下移动、下边缘刚蹭到窗口下沿的过程里,这个条件永远不会命中,完全拦不住角色往下出界。正确的下边界检测应该判断Tesbold.bottom >= HEIGHT(角色下边缘越过窗口下沿),此时将Tesbold.bottom设为HEIGHT,把角色拉回窗口内。
上边界检测部分,代码判断Tesbold.bottom <=0就将bottom值设为0。同理,这需要角色完全飞到窗口顶部、下边缘都小于y=0的位置才会触发,正常角色往上移动、上边缘刚蹭到窗口上沿的过程完全拦不住。正确的上边界检测应该判断Tesbold.top <=0(角色上边缘越过窗口上沿),此时将Tesbold.top设为0,把角色拉回窗口内。
修正后的可正常运行代码
def oob_check(): #Out-Of-Bounce-Check # 所有边界检测拆为独立if判断,不再串成elif链 # 左右边界检测 if Tesbold.right >= WIDTH: Tesbold.right = WIDTH if Tesbold.left <= 0: Tesbold.left = 0 # 上下边界检测(修正原有反向的判断条件) if Tesbold.bottom >= HEIGHT: Tesbold.bottom = HEIGHT if Tesbold.top <= 0: Tesbold.top = 0 def update(): oob_check()
修改后每帧运行时,不管横向是否碰到边界,纵向的越界检测都会独立执行,且判断条件和实际边界位置匹配,四个方向的出界限制可以同时正常生效。
内容的提问来源于stack exchange,提问作者Ignitris
相关产品推荐
相关产品推荐

