首页 > 解决方案 > 浮动动画缓慢地向上移动对象 Pygame

问题描述

我正在为一个应该悬停在原地的对象编写脚本,但它却缓慢地向上移动。继承人的代码:

(初始化函数)

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

标签: pythonpygame

解决方案


来自pygame.Rect 文档

Rect 对象的坐标都是整数

我对此进行了调查,发现当您尝试将矩形的坐标(在本例中为中心)设置为浮点数时,它会采用浮点数下方最接近的整数并使用它。

我做了这个小测试来看看它的实际效果:

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))

并且输出显示是的,预期的_centery 正在像您想要的那样工作,但是 rect.centery 只会继续减少(所以向上移动)

发生这种情况的原因是,由于 Rect 在传递浮点数时采用浮点数下方的整数,因此当您尝试增加中心(向下移动)时,它会不断地将 int 值低于 vy。直到 vy >= 1,rect.centery += vy 将加 0,因为 0.1 - 0.9 下面的 int 为 0。所以不会发生任何有用的事情。

但是,当您将其向上移动时,一旦 vy < 0(-0.1 到 -0.9),它将采用 float 下方的 int ......这将是 -1!


所以结果是你实际上只是继续向上移动而不是向下移动以获得你想要的悬停动作

Rect.centery rounds 像这样浮动的原因是因为它使用“_ int _”将浮点数转换为整数。当你运行测试时,我甚至为此打印了一个 DeprecationWarning。这是导致您的问题的确切原因


据我所知,没有办法获得确切的预期效果。

但是,您可以使用 Python 的内置 round() 方法来接近您想要的结果,但是 centery 只会增加和减少 1,这可能对您不起作用,因为我假设您出于某种原因希望使用浮点数获得这种准确性。但它会“工作”,因为它会同样上下移动

无论如何,希望这会有所帮助(顺便说一句,我在 python 3 中进行了测试和所有内容)


推荐阅读