python - float 动画缓慢向上移动对象 Pygame

标签 python 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

最佳答案

来自 pygame.Rect doc

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/

相关文章:

python - Pygame 初学者程序,屏幕未定义

python - 不会添加计数mastermind游戏python

python - 如何在pygame中为绘图设置动画(运动)

Python 正则表达式模块与 re 模块 - 模式不匹配

python - 将我的 python 脚本从 lxml 转换为 xml.etree

python - 如何使用间隔根据时间删除相同的值?

python - 两个 Pygame Sprite 的 "Bullets"镜头组合成一条长线

python - 将 html 写入 csv 时出现奇怪的格式

python - 为什么检查从父类(super class)继承的类返回不同的行?

Python/Pygame,标签未显示