2016-04-10 8 views
0

私は私には説明できないこの奇妙な速度の振る舞いに偶然出くわしました。メインループ内のprint clock.tick()行が表示されていない場合は、赤い四角が画面幅全体にわたってより滑らかに移動します。誰が原因でこれが起こっているのか説明できますか?パイガム速度の問題

import pygame 
from pygame.locals import * 


class Box(pygame.sprite.Sprite): 

    def __init__(self,color,init_pos): 
     super(Box, self).__init__() 
     self.image=pygame.Surface([50,50]) 
     self.image.fill(color) 
     self.rect=self.image.get_rect() 
     self.rect.topleft=init_pos 
     self.speed=300 
    def update(self,time_passed): 
     moved_distance=self.speed*time_passed 
     self.rect.left+=moved_distance 

pygame.init() 
screen=pygame.display.set_mode([640,480]) 
box=Box((255,0,0),(0,0)) 
clock=pygame.time.Clock() 

while True: 
    for e in pygame.event.get(): 
     if e.type==QUIT: 
      pygame.quit() 
    screen.fill((0,0,0)) 
    time_passed=clock.tick()/1000.0 
    box.update(time_passed) 
    print clock.tick() #this line uncommented moves the red sqaure faster, why? 
    screen.blit(box.image,box.rect) 

    pygame.display.flip() 

答えて

4

clock.tickは、フレームごとに1回呼び出す必要があります。あなたのコードでは、渡されたミリ秒を印刷するだけではなく、ゲームクロックを1回だけ必要なときに複数回更新しています(printに関数を渡しても、その関数を呼び出します)。

また、clock.tickの機能では、フレームレートや画面の変化速度をロックするために、オプションのframerateパラメータを使用していません。これがロックされていないと、オブジェクトは可変速度で動くように見えることがあります。

渡されたミリ秒を印刷する場合は、time_passedという変数を印刷してください。

参考のため、私の答えにはClock.tickに関するpygame documentationの情報があります。

コメントにあなたのフォローアップの質問に関して:

を私は印刷する印刷ラインを変更し、「そこにこんにちは!」それでもclock.tick()の印刷と同じ効果があります。赤い四角形を動かすのではなく、移動させないことが目的でしたが、なぜプリントを置くのがスピードに大きな影響を与えるのかを理解することでした。また、メインループのどこかに印刷物を置くと、ループがスピードアップします。

printステートメントは、メインループ内の他のコードと同様にCPU時間を消費します。 時刻がの間でクロックが更新される間に、より大きな数値がtime_passedになります。

この値が大きいほど、ボックスが速く移動します。最後の更新から10ミリ秒かかるので、timed_passed = 10/1000.0 = 0.01秒としましょう。私たちはあなたのBox.updatemoved_distance = 300 * 0.01 = 3と呼んでいます。それは3単位右に移動します。しかし、フレームレートをロックしていないので、速度が遅くなる場合があります。つまり、速度がの場合はになります。

ここで、クロックアップデート間を経過する時間が少なくなると、time_passedが小さくなります。 printステートメントをコメントアウトし、ボックスはアイドル状態です。どうして? printステートメントまたは他のコードを処理していないため、最終更新から1ミリ秒かかるとします。 time_passed = 1/1000.0 = 0.001秒。あなたの赤い正方形とmoved_distance = 300 * 0.001 = 0.3を更新します。

ボックスを移動するには右にいくつの単位が必要ですか? 0なぜ? rect.leftは整数です。 0.3は0になり、すなわちボックスはアイドルとなる。

+0

私は印刷行を 'print 'に変更しました!''と '' clock.tick() 'と同じ効果があります。私の目的は、赤い四角形を動かすのではなく、移動させないことでしたが、なぜ「プリント」を置くのがスピードにそのような影響を与えるのかを理解することでした。また、 'print'がコメントアウトされるとすぐに、メインループに' print' **をどこかに置くとループが高速化されます。 – amirteymuri

+1

@AmirTeymuri私の最初の答えの更新をご覧ください。 –

+0

これは絶対に意味をなさない! – amirteymuri

関連する問題