Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 浮动动画在游戏中缓慢地向上移动对象_Python_Pygame - Fatal编程技术网

Python 浮动动画在游戏中缓慢地向上移动对象

Python 浮动动画在游戏中缓慢地向上移动对象,python,pygame,Python,Pygame,我正在为一个应该在适当位置悬停的对象编写脚本,但它会慢慢向上移动。代码如下: (初始化函数) (更新功能) self.vy+=self.dy 如果self.vy>1或self.vy1或vy=1之前,rect.centery+=vy将加0,因为下面0.1-0.9的int是0。所以没有什么有用的事情会发生 但是当你把它向上移动的时候,一旦vy

我正在为一个应该在适当位置悬停的对象编写脚本,但它会慢慢向上移动。代码如下:

(初始化函数)

(更新功能)

self.vy+=self.dy
如果self.vy>1或self.vy<-1:
self.dy*=-1
self.imgRect.centery+=self.vy
来自

Rect对象的坐标都是整数

我对此进行了研究,发现当您尝试将rect的坐标(在本例中为centery)设置为浮点值时,它会取浮点值下方最接近的整数并使用该整数

我做了一个小测试,看看它的实际效果:

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))
导入pygame
pygame.init()
window=pygame.display.set_模式((500500),pygame.SCALED)
rect=pygame.rect(250250,50,50)
dy=0.1
vy=0
预期中心=275
尽管如此:
pygame.时间延迟(1000)
vy+=dy
如果vy>1或vy<-1:
dy*=-1
矩形中心+=vy
预期中心+=vy
打印(“\n您想要的:{}\n您得到的:{}”。格式(预定的\u centery,rect.centery))
输出结果显示,是的,预期的_centery正在按照您想要的方式工作,但是rect.centery只会继续减少(因此向上移动)

发生这种情况的原因是,由于传递浮点时Rect取浮点以下的整数,因此当您尝试增加centery(下移)时,它会持续取vy以下的整数。在vy>=1之前,rect.centery+=vy将加0,因为下面0.1-0.9的int是0。所以没有什么有用的事情会发生

但是当你把它向上移动的时候,一旦vy<0(-0.1到-0.9),它将取浮点下面的整数。。。这将是-1


因此,结果是,您实际上只会继续向上移动,而不会向下移动以获得所需的悬停运动

Rect.centery如此循环浮点的原因是它使用“int\ux”将浮点转换为int。当你运行这个测试时,我让它甚至打印了一个关于这个的弃用警告。这正是造成你问题的原因


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

然而,您可以使用Python的内置round()方法来接近所需的精度,但是centery只会增加或减少1,这可能对您不起作用,因为我假设您希望使用float获得这种精度是有原因的。但它会“起作用”,因为它会均匀地上下移动


无论如何,希望这有帮助(顺便说一句,我在Python3中做了测试和所有工作)

我不知道“悬停在原地”是什么意思,但您可以使用
print()
查看变量中的值以及执行代码的哪一部分。或者学习如何使用调试程序。顺便说一句:如果你改变中心位置,它就必须移动。更好地创建最小的工作代码,我们可以运行,看看你试图做什么。好答案!这类问题经常出现,特别是当物体以锐角移动时,即其中一个偏移非常小。例如,将偏移量
(0.1,0.9)
连续添加到每个坐标。如果立即转换为整数,
0.1
变为零,
0.9
变为一。一个简单的解决方案是将当前位置保持为浮点数,并且在绘图时仅转换回整数。
 self.vy += self.dy
 if self.vy > 1 or self.vy < -1:
     self.dy *= -1
 self.imgRect.centery += self.vy
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))