不让角色移出窗外
- 2025-02-20 09:23:00
- admin 原创
- 37
问题描述:
我尝试使用这种代码:
if circleX - 16 == 0:
circleX = 16
elif circleY - 16 == 0:
circleY = 16
elif circleY + 16 == 500:
circleY = 484
elif circleX + 16 == 500:
circleX = 484
elif circleY - 16 == 0 and circleX - 16 == 0:
circleY = 16
circleX = 16
elif circleY + 16 == 500 and circleX + 16 == 500:
circleX = 484
circleY = 484
elif circleY + 16 == 500 and circleX - 16 == 0:
circleY = 484
circleX = 16
elif circleY - 16 == 0 and circleX + 16 == 500:
circleX = 484
circleY = 16
但它似乎不起作用,我做错了什么?
解决方案 1:
我建议使用一个pygame.Rect
对象将圆限制在窗口的边界内,以下window
是显示表面:
radius = 16
clampRect = window.get_rect().inflate(-radius*2, -radius*2)
circleX = max(clampRect.left, min(clampRect.right, circleX))
circleY = max(clampRect.top, min(clampRect.bottom, circleY))
解释:
get_rect()
生成一个与显示关联的pygame.Rect
大小为 的矩形。生成一个新矩形,其大小由圆的直径改变,矩形仍以当前中心为中心。
在下文中,和用于将圆的中心限制在矩形定义的区域中。pygame.Surface
`inflate()` min
`max`
解决方案 2:
您可以避免==
对边界进行相同关系比较。我使用<=
或>=
来比较边界。
我不知道你的代码和上下文,但我想circleX
,circleY
已经通过其他方法进行了更改。
如果它像那样改变变量circleX += 20
,它就可以传递所有的if条件。或者如果它被线程环境中的某些事件调用得太快,我们就不能相信的值circleX
。
我建议比较如下:
if circleX - 16 <= 0: # Left border
circleX = 16
elif circleY - 16 <= 0: # Top
circleY = 16
elif circleY + 16 >= 500: # Bottom
circleY = 484
elif circleX + 16 >= 500: # Right
circleX = 484
elif circleY - 16 <= 0 and circleX - 16 <= 0: # Top Left corner
circleY = 16
circleX = 16
elif circleY + 16 >= 500 and circleX + 16 >= 500: # Bottom right
circleX = 484
circleY = 484
elif circleY + 16 >= 500 and circleX - 16 <= 0: # Bottom left
circleY = 484
circleX = 16
elif circleY - 16 <= 0 and circleX + 16 >= 500: # Top right
circleX = 484
circleY = 16
并且可以通过使用较少的 if 条件来缩短它:
if circleX - 16 <= 0: # Left border
circleX = 16
if circleY - 16 <= 0: # Top Left corner
circleY = 16
elif circleY - 16 <= 0: # Top
circleY = 16
if circleX + 16 >= 500: # Top right
circleX = 484
elif circleY + 16 >= 500: # Bottom
circleY = 484
if circleX - 16 <= 0: # Bottom left
circleX = 16
elif circleX + 16 >= 500: # Right
circleX = 484
if circleY + 16 >= 500: # Bottom right
circleY = 484
但是,我个人最喜欢的短代码是:
circleX = min(max(16, circleX), 484)
circleY = min(max(16, circleY), 484)
相关推荐
热门文章
项目管理软件有哪些?
- 2025年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
热门标签
云禅道AD