用 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 游戏循环中跟踪时间/帧的最佳方法是啥?