1

在过去的几年里,我编写了一些 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 库来导入我在平铺地图编辑器中制作的地图。我希望这是足够的信息来回答我奇怪的问题。我问过我的另一个编程朋友,他觉得很奇怪。

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

感谢您的时间!

4

2 回答 2

1

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

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

pygame 文档建议pygame.time.Clock.tick_busy_loop()您是否需要更准确(但 CPU 密集型)的计时器。

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

于 2013-08-19T21:04:10.083 回答
0

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

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

于 2013-08-19T19:31:07.657 回答