2012-03-01 17 views
1

いくつかのボックスが画面上を移動する単純なパイゲームプログラムを作成しようとしています。私はthis exampleに従っています。pygameの一貫性のない更新

チュートリアルでは、以下の構造を有する:

class Box(pygame.sprite.Sprite): 
... 
    def update(self, currtime): 
     if self.next_update_time < current_time: 
      print time.time() # I added this to debug 
      # Do some stuff 
      self.next_update_time = current_time + 10 

box = Box() 
while True: 
    pygame.time.delay(10) 
    time = pygame.time.get_ticks() 
    box.update(time) 

マイボックスは非常にスムーズに移動ではなく。彼らはスピードアップし、公正なビットを遅くする。更新が行われるポイントをプロットすると、thisが得られます。

私はこのチュートリアルで提案されているデザインの問題のようですか?ハードウェアに問題はありますか?

EDIT:ラドミルDopieralskiの答えに基づいて 、より良いアプローチがある:

class Box(pygame.sprite.Sprite): 
... 
    def update(self): 
      # Do some stuff 

box = Box() 
clock = pygame.time.Clock() 
while True: 
    clock.tick(100) 
    box.update() 
+0

私はチュートリアルに 'pygame.time.delay(10)'があることに気づいたので、これは愚かな質問です。 – ajwood

+0

問題は実際にはまだありますが、遅延を追加する前と同じくらい悪くはありません。そして、遅延/更新を5に落とすと、本当に悪いです。だから私はこれが有効な質問だと思う。 – ajwood

+0

グラフの+1 – Darthfett

答えて

2

事はpygame.time.delay(10)は常にどんなに長いボックスの描画およびその他のもの、同じ時間を待たないだろうということですあなたはゲームのループで行う。したがって、待っている合計時間は10+render_timeです。

幸いにも、pygameのダウンロードは、この解決策に付属している:pygame.time.Clockクラスと、それが最後に使用された時間を記憶し、それに応じて時間の小さいまたは大きい量待機.tick(framerate)方法だ、フレームレートを一定に保つために。

+0

pygame.time.Clock.tickの使い方が不明です私の例では。 – ajwood

1

私はあなたがpygame.timeが提供するクロックオブジェクトを使用する必要があると思う:あなたがしたい場合

def update(self, miliseconds_passed): 

    self.pos[0] += self.spped[0] * dt # Speed must be in pixels_per_millisecond 
    self.pos[1] += self.spped[1] * dt 

注:

c = pygame.time.Clock() 

while True: 

    dt = c.tick(framerate) # 0 for framerate removes the cap 

    ... 

    ex_box.update(dt) 

と更新方法は、次のようになります速度は1秒あたりのピクセル数で "* dt/1000"にする必要があります。ちょうど "* dt"の代わりに。

速度をm/s単位で設定する場合は、「1メートルあたりのピクセル数」を設定し、速度にdt/1000を掛けなければなりません。 * ppm

関連する問題