本帖最后由 KarsonCN 于 2022-5-2 12:07 编辑
复制代码在运行一个血条代码的时候出血了一点问题
- def__init__(self):
- self.hp = 玩家当前生命值
- self.max_hp = 玩家最大生命值
- self.hpAni = self.hp/self.max_hp
- def HP_Bar(self):
- if 玩家当前生命值 != self.hp or 玩家最大生命值 != self.max_hp:
- self.hp = 玩家当前生命值
- self.max_hp = 玩家最大生命值
- self.hpPercent = float(self.hp) / float(self.max_hp) # 当前血量百分比
-
- if self.hpAni > self.hpPercent:
- self.hpAni -= 0.01
- self.GetBaseUIControl(self.hp_bar).asProgressBar().SetValue(self.hpAni)
-
- elif self.hpAni < self.hpPercent:
- self.hpAni += 0.01
这是一个一秒执行30次的函数,一直就是动态刷新血条
可是不知道为什么后面两个if,elif会不断跳入
造成血条+0.01 -0.01
当我把elif改成if就正常了
请问有知道为什么的吗
本帖最后由 cnYeqi 于 2022-5-2 13:05 编辑
你的目的应该是体现出当前血量百分比如果大于或小于百之前的血量百分比就有一个逐渐改变直到记录百分比和真实百分比相等过程,但是血量的精度是多少呢?如果是当前为0.5256记录血量为0.5257,那么执行一次-0.01后记录血量变为0.5157,又不一样了,再次+0.01又变为0.5257,就会一直跳来跳去,有elseif 每次执行只会执行其中之一,你把else去了,就是在每次运行+0.1 -0.1互相抵消,看起来是不跳来跳去了,但是我觉得这也算不上正常吧...
解决方法就是只取前两位小数呗
个人理解,可能有问题....
你的目的应该是体现出当前血量百分比如果大于或小于百之前的血量百分比就有一个逐渐改变直到记录百分比和真实百分比相等过程,但是血量的精度是多少呢?如果是当前为0.5256记录血量为0.5257,那么执行一次-0.01后记录血量变为0.5157,又不一样了,再次+0.01又变为0.5257,就会一直跳来跳去,有elseif 每次执行只会执行其中之一,你把else去了,就是在每次运行+0.1 -0.1互相抵消,看起来是不跳来跳去了,但是我觉得这也算不上正常吧...
解决方法就是只取前两位小数呗
个人理解,可能有问题....
cnYeqi 发表于 2022-5-2 12:25
你的目的应该是体现出当前血量百分比如果大于或小于百之前的血量百分比就有一个逐渐改变直到记录百分比和真 ...
我是把elif改成了if,不是把else去了,
在第十行
- print self.Ani,self.hpPercent,print self.Ani == self.hpPercent
会得的到5.0,5.0,false
等等前面两个数print出来相等,但是flase了的结果
本帖最后由 cnYeqi 于 2022-5-2 14:28 编辑
elif和前面if是一体的,改成if就等于是把else去掉了,单独成为一个条件,他和上一个是并列的,区别在于if..elif..只会运行两者之一或不运行,而if...if...只要条件满足就都可以运行,还有5.0 5.0的问题,你人为取一位小数试试再对比一下吧,我python用得不多,不知道这个print会不会在显示的时候增加格式控制,我认为这两个5.0后面还有位数并且是不相等的...
KarsonCN 发表于 2022-5-2 14:15
我是把elif改成了if,不是把else去了,
在第十行
会得的到5.0,5.0,false
elif和前面if是一体的,改成if就等于是把else去掉了,单独成为一个条件,他和上一个是并列的,区别在于if..elif..只会运行两者之一或不运行,而if...if...只要条件满足就都可以运行,还有5.0 5.0的问题,你人为取一位小数试试再对比一下吧,我python用得不多,不知道这个print会不会在显示的时候增加格式控制,我认为这两个5.0后面还有位数并且是不相等的...
KarsonCN 发表于 2022-5-2 14:15
我是把elif改成了if,不是把else去了,
在第十行
会得的到5.0,5.0,false
round(self.Ani, 1) , round(self.hpPercent,1) , print round(self.Ani, 1) == round(self.hpPercent,1)
本帖最后由 KarsonCN 于 2022-5-2 18:09 编辑
默认是没有位数限制的
而且max_hp固定是20,
看倒数第二行0.7,0.7 false
复制代码
cnYeqi 发表于 2022-5-2 14:31
round(self.Ani, 1) , round(self.hpPercent,1) , print round(self.Ani, 1) == round(self.hpPercent,1)
默认是没有位数限制的
而且max_hp固定是20,

看倒数第二行0.7,0.7 false
- print self.hpAni, self.hpPercent, type(self.hpAni), type(self.hpPercent),self.hpAni == self.hpPercent
- if self.hpAni > self.hpPercent:
- self.hpAni -= 0.01
- self.GetBaseUIControl(self.hp_bar).asProgressBar().SetValue(self.hpAni)
- elif self.hpAni < self.hpPercent:
- self.hpAni += 0.01
KarsonCN 发表于 2022-5-2 17:55
默认是没有位数限制的
而且max_hp固定是20,
浮点数在内存中存储只保证在精度内的数值正常,精度外不保证也就是说可能5.2000000009和5.20000000006这两个数你显示结果是相同的,但是比对是false,使用math.isclose(a,b)可以判断这两个数是否相近