python 在游戏引擎中模拟动量

olhwl3o2  于 2022-11-26  发布在  Python
关注(0)|答案(1)|浏览(118)

只是为了好玩,我一直在Pygame over break中开发一个简单的平台引擎。今天我尝试添加一些动力代码,这样玩家就不会立即停止,但是我遇到了一个问题。我的动力代码不会在所有可能的FPS速率下以恒定的速率降低玩家的速度。下面是我的代码:

def getXDisplacement(self):
        pressed = pygame.key.get_pressed()
        dt = self.xTimer.elapsedTime()
        self.momentum = self.momentum * ( (1-self.momentumDecayRate) ** dt)
        self.xDisplacement = ((self.rightKey.ifActive(pressed)-self.leftKey.ifActive(pressed)) + self.momentum)    
        self.momentum = self.xDisplacement
        self.xDisplacement *= dt
        self.xDisplacement = numpy.clip(self.xDisplacement, -700*dt, 700*dt)
        self.xTimer.reset()

为了降低FPS速度,我将在getXDisplacement()函数的顶部添加一个print()函数,并注解掉底部的numpy.clip()函数,以查看总体速度如何受到影响。玩家加速慢得多,不能达到与高FPS速率相同的速度。我无法想象为什么指数衰减函数在这里不起作用。我是否使用不当,或者问题比我想象的更复杂?以下是完整程序的链接,以供参考:https://github.com/2Amateurs/SimplePygamePlatformer.

q0qdq0h2

q0qdq0h21#

您可以使用pygame时钟来限制最大FPS:

clock = pygame.time.Clock()
# in your game loop
while True:
    clock.tick(FPS)

如果你确定你的游戏不会慢于30FPS,这已经足够了。如果不是,你可以用时钟来计算最后一帧和这一帧之间的时间差。

clock = pygame.time.Clock()
# in your game loop
while True:
    delta_time = clock.tick_busy_loop()
    getXDisplacement(delta_time)

def getXDisplacement(self, dt):
        pressed = pygame.key.get_pressed()
        self.momentum = self.momentum * ( (1-self.momentumDecayRate) ** dt)
        self.xDisplacement = ((self.rightKey.ifActive(pressed)-self.leftKey.ifActive(pressed)) + self.momentum)    
        self.momentum = self.xDisplacement
        self.xDisplacement *= dt
        self.xDisplacement = numpy.clip(self.xDisplacement, -700*dt, 700*dt)

tick_busy_loop不是唯一的方法,还可以查看Clock.get_time。

相关问题