【问题标题】:Pygame/Python. Left seems to move faster than right. Why?Pygame/Python。左边似乎比右边移动得快。为什么?
【发布时间】:2013-08-19 19:09:38
【问题描述】:

在过去的几年中,我编写了一些 c++ 和 java 代码,现在我开始使用 python。目标是制作游戏。然而,我注意到,在玩家左右移动的基本动画部分,我的左侧“速度”比右侧“速度”快。虽然我的“速度”值完全相同。

更新函数:

def update(self,dt,game):
    last=self.rect.copy()


    self.time+=dt


    if self.left:
       self.rect.x-=300*dt
    if self.right:
       self.rect.x+=300*dt

我注意到,如果我将左侧速度更改为 250,而不是 300,它将运行相同。例如,如果我同时按下左右键,玩家将停留在完全相同的位置。但是,如果我的左右速度都为 300。玩家将缓慢地向左移动。

我的游戏循环:

while 1:
        dt=clock.tick(60)
        if dt>1000/60.0:
            dt=1000/60.0

        for event in pygame.event.get():
            if event.type==pygame.QUIT:
                return
            if event.type==pygame.KEYDOWN and event.key==pygame.K_ESCAPE:
                return
            if event.type==pygame.KEYDOWN and event.key==pygame.K_LEFT:
                self.player.left=True
                self.player.image=self.player.leftimages[1]
            if event.type==pygame.KEYDOWN and event.key==pygame.K_RIGHT:
                self.player.right=True
                self.player.image=self.player.rightimages[1]
            if event.type==pygame.KEYUP and event.key==pygame.K_LEFT:
                self.player.left=False
                self.player.image=self.player.leftimages[0]
            if event.type==pygame.KEYUP and event.key==pygame.K_RIGHT:
                self.player.right=False
                self.player.image=self.player.rightimages[0]

        self.tilemap.update(dt/1000.0,self)
        screen.fill((0,0,0)) 
        self.tilemap.draw(screen)
        pygame.display.update()

我正在使用 Richard Jones 的 tmx 库来导入我在平铺地图编辑器中制作的地图。我希望这是足够的信息来回答我的奇怪问题。我问过我的另一个编程朋友,他觉得很奇怪。

某些代码可能已关闭,因为我刚刚从包含更多内容的原始代码中复制粘贴。但我已经提取了控制运动的最基本部分。

感谢您的宝贵时间!

【问题讨论】:

  • 警告,pygame.Rect 使用 int,您可能会丢失精度。您可以将播放器位置存储为float,然后将rect.topleftrect.center 设置为它。

标签: python animation pygame


【解决方案1】:

您是否尝试过从您的update 函数中打印dt 的值?如果向左移动的速度与向右移动的速度不同,那么这就是必须改变的(支持你说同时按住左右不会导致移动)。

根据我自己的测试,pygame.time.Clock.tick() 返回一个整数值,表示自上次调用以来经过的毫秒数。如果您尝试更正此值 (dt=1000/60.0),您将获得一个浮点值。我怀疑由于某种原因,当按下左键或右键时计时器关闭,并且您尝试手动更正它会导致在这些情况下将不同的dt 值传递给update 函数。

如果您需要更准确(但 CPU 密集型)的计时器,pygame 文档建议使用 pygame.time.Clock.tick_busy_loop()

http://www.pygame.org/docs/ref/time.html#pygame.time.Clock.tick_busy_loop

【讨论】:

  • 我已经打印了 dt 值并检查了它是否显示出任何差异,但事实并非如此。我用 dt 调用更新函数,所有 dt 都完全相同。它们显示 33 毫秒(1000/30)...无论我按左键还是右键,它们都没有区别:S...我的时间更新方法不好吗?大多数人如何使用更新方法和“游戏物理”?
  • 我现在发现了错误。它在四舍五入!当我的播放器向左移动时,我的速度为 300,时钟刻度为每秒 60 帧。这给出了每帧 1.6 个像素的位置变化。现在当你减去像素时,如果你取-1.6,它会将它四舍五入为-2......当你添加1.6时,它只会将它添加为1..我在命令提示符上打印它并在548像素/之前得到这个位置帧 -1.6 546 之后的位置 546 之前的位置 像素/帧 -1.6 544 之后的位置 544 之前的位置 像素/帧 1.6 545 之后的位置 545 之前的位置 像素/帧 1.6 546 之后的位置
  • @Batko 看起来当像素显示它们只是被铺满时,所以你可以从左/上方向减去 1,它应该可以按预期工作,除非在极少数情况下。您的 cmets 帮助了我;您应该发布您的发现作为答案。
【解决方案2】:

您应该每帧调用一次pygame.time.Clock.tick,而不是计算自上一帧以来的时间变化,然后根据玩家将移动多远。然后你可以假设每次帧之间的时间都是一样的,所以dt总是一样的。

到目前为止,如果 fps 下降,您程序中的其他所有内容都会变慢,但您的播放器将开始比其他所有内容更快地向前跳跃。而不是依赖于经过的时间,通常最好依赖于 fps。

【讨论】:

  • 我正在调用它。我将时钟定义为clock=pygame.time.Clock() 然后使用clock.tick
  • @Batko 我在发布此内容后意识到这一点,但它仍然适用。让物理依赖于帧而不是实时几乎总是更好。有什么理由让你反其道而行之吗?
  • 好吧,当我按照教程进行时,演讲者说最好按照时间进行。那么它现在不是也依赖于框架吗?
  • @Batko 您更新位置的频率取决于帧,但实际的物理特性,速度 (ds/dt),您将依赖时间
  • 好的,你建议我如何让它依赖于框架呢?我现在对如何处理这件事有点迷茫
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-23
  • 1970-01-01
  • 2018-09-20
  • 1970-01-01
相关资源
最近更新 更多