我正在为一个应该悬停在适当位置的对象编写脚本,但它却慢慢向上移动。代码如下:
(初始化函数)
self.vy = 0
self.dy = 0.1
(更新函数)
self.vy += self.dy
if self.vy > 1 or self.vy < -1:
self.dy *= -1
self.imgRect.centery += self.vy
最佳答案
The coordinates for Rect objects are all integers
我对此进行了调查,发现当您尝试将矩形的坐标(在本例中为中心)设置为 float 时,它会采用浮点下方最接近的整数并使用它。
我做了这个小测试来看看它的实际效果:
import pygame
pygame.init()
window = pygame.display.set_mode((500,500), pygame.SCALED)
rect = pygame.Rect(250,250,50,50)
dy = 0.1
vy = 0
intended_centery = 275
while True:
pygame.time.delay(1000)
vy+= dy
if vy > 1 or vy < -1:
dy *= -1
rect.centery+= vy
intended_centery += vy
print("\nWhat you want:{}\nWhat you get: {}".format(intended_centery,rect.centery))
输出显示,是的,intent_centery 正在按照您想要的方式工作,但 rect.centery 只会继续减小(因此向上移动)
发生这种情况的原因是,由于当您传递 float 时,矩形会采用 float 下方的整数,因此当您尝试增加中心点(向下移动)时,它会不断地采用 vy 下面的整数。在 vy >= 1 之前, rect.centery += vy 将添加 0,因为下面 0.1 - 0.9 的 int 为 0。因此不会发生任何有用的事情。
但是当你将其向上移动时,一旦 vy < 0(-0.1 到 -0.9),它将采用 float 下面的 int...这将是 -1!
因此,结果是您实际上只能继续向上移动,而不会向下移动以获得您想要的悬停 Action
Rect.centery 之所以对 float 进行四舍五入,是因为它使用“_ int _”将 float 转换为整数。当您运行测试时,我什至为此打印了 DeprecationWarning。这正是导致您出现问题的原因
据我所知,没有办法获得确切的预期效果。
但是,您可以使用Python的内置round()方法来接近您想要的,但是centery只会增加和减少1,这可能对您不起作用,因为我假设您希望通过使用 float 来获得准确度原因。但它会“起作用”,因为它会均匀地上下移动
无论如何,希望这有帮助(顺便说一句,我在 python 3 中进行了测试和所有操作)
关于python - float 动画缓慢向上移动对象 Pygame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60518065/