簡単なはずです。
フレーム番号を変数に記録する場合、表示するアニメーション フレーム番号を取得する必要があるフレーム数でこれをモジュロすることができます。
frame_count = 0
animation_frames = 4
while quit == False:
# ...
# snip
# ...
area = pygame.Rect(
image_number * 100,
(frame_count % animation_frames) * 150,
100,
150
)
display.blit(sprite, sprite_pos, area)
pygame.display.flip()
frame_count += 1
異なるアクションのフレーム数が異なる場合、image_number を更新するときに animation_frames を更新する必要があります。
また、これは、どのフレームからでもアニメーションを再生できることを前提としています。そうでない場合は、アクションが開始されたときのフレーム カウントを記録し、モジュロ前のフレーム カウントからこれを取り除く必要があります。
area = pygame.Rect(
image_number * 100,
((frame_count - action_start_frame) % animation_frames) * 150,
100,
150
)
イベント処理に関するメモ。たとえば、左を押したまま右をタップして左を押し続けると、処理した最後のイベントがキーアップ イベントだったので、まだ左を押しているにもかかわらず、スプライトの動きが止まります。
これが望ましくない場合は、関心のあるキーのアップ/ダウン状態の記録を保持するか、pygame.key.get_pressedインターフェイスを使用することで回避できます。
別の注意点として、固定フレーム レートを目指していると同時に、最後のフレームでかかった時間に基づいてスプライトを移動する距離を決定しているように見えます。私の意見では、これはおそらく理想的ではありません。
2D アクション ゲームは通常、予測可能な方法で動作する必要があります。CPU 負荷の高いプロセスがコンピューターのバックグラウンドで開始され、ゲームが 1 秒間に 60 フレームを大量に生成できなくなった場合は、オブジェクトがフレーム間で大きな距離をスキップし始めるよりも、速度を落とす方がおそらく望ましいでしょう。メタルスラッグのような 2D アクション ゲームで、銃弾を避けて飛び回らなければならない状況を想像してみてください。
これにより、物理計算もはるかに簡単になります。ゲームの種類に基づいて判断を下す必要があります。