パイゲーム clock.tick()
この記事では、clock.tick()
メソッドと、それが pygame モジュールでどのように機能するかについて学びます。 また、ティックと fps の違いについても学びます。
Pygame ゲームループで clock.tick()
と FPS を使用する
clock.tick()
vs FPS
clock.tick()
という関数を見ていきます。 この関数を呼び出すと、プロセッサが実行するティック数が返されます。
tick()
に 150 を入れると、プロセッサの実行時間となる 0.15 秒で 150 ティックが完了します。
ループが実行されるたびに 1 ピクセル移動すると、プロセッサが高速なコンピューターでは高速になり、プロセッサが低速なコンピューターでは遅くなります。 クロック ティックを使用するときは常に、1 ティックが 1 ミリ秒に等しいと計算されるため、これを知っておくことは重要です。
FPS は 1 秒あたりのフレームレートを表し、FPS は GPU の能力によって異なります。 たとえば、30 fps でゲームをプレイしている場合、1 秒あたり 30 フレームと表示されますが、人間の目には変化が見えません。
ストリーミング中にゲームが再生されない場合は、GPU の処理速度が遅いことが原因です。
clock.tick()
メソッドのワークフロー
実際のコードに入る前に、タイマーのロジックについて話しましょう。Pygame には、数秒待ってからコードを実行する組み込み関数がないためです。ただし、そのような関数がないため、タイマーを作成する必要がありました。
pygame
を開始すると、タイマーが実行を開始し、ミリ秒単位でカウントアップし、経過した時間を測定できます。 できるだけ頻繁に単一のポイントを測定し、それをタイマーに変える必要があります。
静的ポイントを呼び出したら、ポイントを継続的に測定する必要があり、中断ポイントは最後の時間または現在の時間になります。 現在の時間と静的ポイントの違いは、タイマーの長さです。
2 秒のタイマーが必要な場合は、current-time - static-time>2000
のような行が必要で、必要なコードを実行します。 1 フレームごとに時間を測定するだけなので、ミリ秒ごとには測定しません。 1 秒あたり 60 フレームの場合、16 ミリ秒ごとに時間を測定するだけです。
すべてのロジックを Python スクリプトに実装しましょう。
import pygame
import sys
pygame.init()
Myscreen = pygame.display.set_mode((800, 800))
clock = pygame.time.Clock()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
pygame.display.flip()
clock.tick(60)
pygame
モジュールのインポートから開始し、次に pygame を開始し、800 x 800 ピクセルのウィンドウを表示するメイン ディスプレイ サーフェス オブジェクトを作成します。 次の行では、pygame.time.Clock()
を使用して時計を作成し、何時を正確に測定します。
次に、ゲーム ループに入り、プレイヤーがエスケープ ボタンを押したかどうかを確認します。 この pygame.display.flip()
はフレームを描画し、clock.tick(60)
は時間を正確に測定するので、毎秒 60 フレームになります。
タイマーを実装するには、MyCurrent_Time
という変数を作成します。これは 0 で、この変数はすべてのフレームの時間を格納します。 この変数はこの while ループで使用され、pygame.time.get_ticks()
を呼び出してミリ秒を返します。
ここで、button_pressTime
という別の変数を作成して 0 で初期化し、ボタンがキーを押し下げられたかどうかを確認します。 したがって、この変数を取得して、同じ関数 pygame.time.get_ticks()
を割り当てます。
下キーを押した後、画面を白で塗りつぶします。 fill()
メソッドを使用してタプルで RGB 値を渡すと、2 秒後にウィンドウ画面が黒色で塗りつぶされます。
完全なコード スニペット:
import pygame
import sys
pygame.init()
Myscreen = pygame.display.set_mode((800, 800))
clock = pygame.time.Clock()
MyCurrent_Time = 0
button_pressTime = 0
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.KEYDOWN:
button_pressTime = pygame.time.get_ticks()
Myscreen.fill((255, 255, 255))
MyCurrent_Time = pygame.time.get_ticks()
if MyCurrent_Time - button_pressTime > 2000:
Myscreen.fill((0, 0, 0))
print(f"current time {MyCurrent_Time} button pressed time {button_pressTime}")
pygame.display.flip()
clock.tick(60)
出力では、ティックごとに現在の時間が増加し、下キーを押さない限り静的時間は 0 のままであることがわかります。
出力:
Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.
LinkedIn