5

うまくいけばFPSを考慮したpythonゲームループを書こうとしています。ループを呼び出す正しい方法は何ですか? 私が考えたいくつかの可能性を以下に示します。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 を使用しますか?

4

1 に答える 1

16

私の理解が正しければ、ゲーム ロジックをタイム デルタに基づいて作成する必要があります。

すべてのフレーム間のタイム デルタを取得してから、そのタイム デルタに関してオブジェクトを移動させます。

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;

1 秒あたりのフレーム数も制限したい場合は、更新ごとに適切な時間だけスリープするのが簡単な方法です。

FPS = 60

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

これは、ハードウェアがゲームに対して十分に高速である場合にのみ機能することに注意してください。ゲーム ループの詳細については、こちらを確認してください。

PS) Javaish 変数名で申し訳ありません... Java コーディングから休憩を取ったところです。

于 2013-04-30T14:08:44.583 に答える