用 Python 编写游戏循环的正确方法是啥?

Posted

技术标签:

【中文标题】用 Python 编写游戏循环的正确方法是啥?【英文标题】:What's the proper way to write a game loop in Python?用 Python 编写游戏循环的正确方法是什么? 【发布时间】:2013-04-30 13:31:53 【问题描述】:

我正在尝试编写一个 Python 游戏循环,希望能够考虑到 FPS。调用循环的正确方法是什么?我考虑过的一些可能性如下。我试图不使用像 pygame 这样的库。

1.

while True:
    mainLoop()

2.

def mainLoop():
    # run some game code
    time.sleep(Interval)
    mainLoop()

3.

 def mainLoop():
    # run some game code
    threading.timer(Interval, mainLoop).start()

4。 使用 sched.scheduler?

【问题讨论】:

第二个和第三个选项从自己开始同一个方法,所以随着时间的推移会有一些增长…… "我不想用pygame这样的框架" -- 那你想用什么? Tkinter?我认为您需要先告诉我们您打算做什么,然后我们才能给您任何建议。 另外,1 应该写成while True: :) 还不确定我将在 GUI 中使用什么。我基本上有数百架飞机飞来飞去,需要更新它们的位置。 【参考方案1】:

如果我理解正确,您希望您的游戏逻辑基于时间增量。

尝试获取每帧之间的时间增量,然后让您的对象相对于该时间增量移动。

import time

while True:
    # dt is the time delta in seconds (float).
    currentTime = time.time()
    dt = currentTime - lastFrameTime
    lastFrameTime = currentTime

    game_logic(dt)


def game_logic(dt):
    # Where speed might be a vector. E.g speed.x = 1 means
    # you will move by 1 unit per second on x's direction.
    plane.position += speed * dt;

如果您还想限制每秒帧数,一个简单的方法是在每次更新后休眠适当的时间。

FPS = 60

while True:
    sleepTime = 1./FPS - (currentTime - lastFrameTime)
    if sleepTime > 0:
        time.sleep(sleepTime)

请注意,这只有在您的硬件对您的游戏来说足够快时才有效。有关游戏循环的更多信息,请查看this。

PS) 抱歉,Java 变量名称...刚从一些 Java 编码中休息一下。

【讨论】:

以上是关于用 Python 编写游戏循环的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在 requestAnimationFrame 游戏循环中跟踪时间/帧的最佳方法是啥?

用导航组件实现循环逻辑的正确方法是啥

中断事件循环后清理的正确方法是啥?

避免在循环中使用嵌套的可观察订阅的正确方法是啥?

在 AJAX 调用(使用 ExpressJS)之后,在 EJS 模板中循环遍历数组的正确方法是啥?

编写游戏循环的困惑