【问题标题】:Pygame - maintain playing speed of game when keys are pressedPygame - 按下按键时保持游戏的播放速度
【发布时间】:2015-04-15 00:03:29
【问题描述】:

我有一个太空侵略者风格的游戏,它运行良好,但是当我按下一个键来移动我的玩家的飞船时,外星人会减速,直到松开键。这是因为按下键时运行的代码比不按下键时运行的代码多(显然)。这是我按键时运行的代码

keys = pygame.key.get_pressed()
if keys[pygame.K_UP]:
    objShip.move(1)
elif keys[pygame.K_RIGHT]:
    objShip.move(2)
elif keys[pygame.K_DOWN]:
    objShip.move(3)
elif keys[pygame.K_LEFT]:
    objShip.move(4)

调用如下代码

def move(self, d):
    self.direction = d
    if self.direction == 1:
        self.image = pygame.image.load("shipu.png").convert()
        if self.yco >= 0:
            self.yco -= 1
        if self.xco >= 884:
            self.xco = 860

有没有一种方法可以平衡外星人的速度,而不涉及将等待命令(或空循环或其他任何东西)放入 else 语句以充当制造延迟?

我可以把所有的代码都放在这里,但是现在有点长,所以我想我会尝试一下,以防有明显的我遗漏的东西。

【问题讨论】:

  • 你打算做什么样的运动?您想要静态速度还是使用加速度的变化速度?
  • 我只是想让船在按键时以固定的速度移动(目前是1像素)
  • 然后设置静态速度为self.speed = 1。然后从位置上加减。
  • 我已经这样做了,只是硬编码为 1 个像素,而不是添加 1 个像素的属性

标签: python pygame


【解决方案1】:
self.image = pygame.image.load("shipu.png").convert()

每次移动时,您都会重新加载船只图像。不要这样做。

加载图像会返回一个表面,将该表面存储在船的对象中,并在每一帧以船的坐标渲染该表面,无需再次加载图像。

加载文件非常慢,这就是为什么您会看到如此显着的减速。

考虑到您有多个用于不同运动状态的图形,请在创建飞船时一次加载所有图像,并将它们生成的表面存储在单独的变量或字典中。当您需要在图形之间交换时,只需将表面换成所需的表面即可。

无论你做什么,只加载一次所有图像!

当您将其更改为我刚才建议的方式时,仍然会发生减速,但至少不会察觉。 为了随着时间的推移平衡运动,您需要使用“增量时间”。这基本上是基于渲染时间的距离。

【讨论】:

  • 船舶图像每次都需要改变,使其朝向行进方向。我可以将先前的位置存储在另一个属性中,然后检查方向是否已更改,如果是,请更新图像:S
  • @Glyn 所以将所有图像加载并存储在单独的变量或字典中。并从那里选择它们。不管你做什么,加载图像一次。
  • 就是这样,这绝对是重新加载图形需要时间。我对其他图形也做了同样的事情,并且在发射子弹时也消除了打嗝。谢谢
  • @Glyn 将其标记为答案然后...:D 我将编辑我的答案以包含我的评论。
猜你喜欢
  • 2013-10-23
  • 1970-01-01
  • 2019-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多