如何在Python/Ursina引擎中创建子弹冷却进度条?
如何在Python/Ursina引擎中创建子弹冷却进度条?
嘿,我完全懂你遇到的麻烦——Ursina里默认的Entity缩放是基于自身中心的,所以你调整scale_x的时候,它会同时往左右两边拉伸,自然就和你想要的单向进度条效果不符了。别着急,咱们一步步把这个问题解决掉。
先拆解下核心问题:你现在是直接缩放整个进度条实体,但我们需要让进度条从某一侧(比如左侧)开始往单侧填充,而不是从中间向两边扩展。这里有两个简单好用的解决思路:
思路1:调整实体的原点(Origin)
Ursina里的origin属性决定了实体缩放、旋转的基准点。我们把进度条的原点设置到左侧,这样修改scale_x时,就只会往右侧延伸了。
直接修改你的代码如下:
# 先创建玩家和进度条,重点设置origin Player = Karakter() BulletBar = Entity( model="quad", position=(-13, -9, -2), scale=(12, 0.5, 1), color="FFFF00", origin=(0, 0.5) # 关键:把缩放基准点设在左侧垂直中心 ) # 你的冷却逻辑部分保持不变,现在缩放就会单向延伸了 if mermiat == False and mertim >= 0.5: mermiat = True mertim = 0 elif mermiat == True and mertim >= 0.5: mertim = 0 if mermiat == True: BulletBar.scale_x = 12 else: BulletBar.scale_x = mertim * 24
这样调整后,进度条就会从左侧开始,随着mertim的增加向右填充,完美符合你的需求。
思路2:背景条+填充条的组合(更直观的方案)
如果觉得调整原点有点抽象,你可以做两层实体:一层是固定大小的深色背景条,另一层是作为填充的黄色进度条。填充条的锚点设到左侧,只需要调整它的scale_x就能实现单向填充的效果。
示例代码:
Player = Karakter() # 先创建背景条,固定尺寸 BulletBarBackground = Entity( model="quad", position=(-13, -9, -2), scale=(12, 0.5, 1), color="333333" # 深灰色背景,和黄色填充区分开 ) # 创建填充条,初始scale_x为0,原点设到左侧 BulletBar = Entity( model="quad", position=(-13, -9, -1), # z轴比背景高,确保显示在上方 scale=(0, 0.5, 1), color="FFFF00", origin=(0, 0.5), anchor=(0, 0.5) ) # 冷却逻辑保持一致 if mermiat == False and mertim >= 0.5: mermiat = True mertim = 0 elif mermiat == True and mertim >= 0.5: mertim = 0 if mermiat == True: BulletBar.scale_x = 12 # 填满背景 else: BulletBar.scale_x = mertim * 24 # 随时间递增填充
这种方式视觉上更清晰,后续调整样式(比如加个边框)也更方便。
另外,我还可以给你的冷却逻辑提个小优化,让代码更简洁:
# 简化后的冷却判断 if mertim >= 0.5: if not mermiat: mermiat = True mertim = 0 # 时间到了就重置计时器,不管当前是否能射击
内容来源于stack exchange
相关产品推荐
相关产品推荐

