それは簡単なはずです。
変数にフレーム番号を記録する場合は、表示するアニメーションフレーム番号を取得する必要があるフレーム数でモジュロすることができます。
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アクションゲームで起こった場合、弾丸を避けて飛び回らなければならないことを想像してみてください。
これにより、物理計算もずっと簡単になります。あなたはそれがどんなゲームのタイプに基づいて判断を下す必要があります。
この質問は非常に混乱しています。テキストを読んでクリアして、あなたが望むものを理解するようにしてください。 –