3

誰かからもらったいくつかのコードを微調整した後、文字の画像をその方向と上下左右の入力に関して移動させ、これをまとめました: (コードが乱雑でないことを願っています)

キャラクター移動コード + IMG

スプライト シートは縦方向にのみ実行されるため、基本的に各スプライト セクションは異なるアクションです。アニメーションを作成するために、現在のコードで機能するコードを作成して、セットの「アクション」からサイクルダウンする方法はありますか?

例: 「Run Left」はスプライト 3 です。では、その列を指定した後、アニメーションを作成するために、実行アニメーションのフレーム数 (4 としましょう) をループダウンできますか?

サンプル画像: http://animania1.ca/ShowFriends/dev/example.jpg代替テキスト

4

1 に答える 1

4

簡単なはずです。

フレーム番号を変数に記録する場合、表示するアニメーション フレーム番号を取得する必要があるフレーム数でこれをモジュロすることができます。

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 アクション ゲームで、銃弾を避けて飛び回らなければならない状況を想像してみてください。

これにより、物理計算もはるかに簡単になります。ゲームの種類に基づいて判断を下す必要があります。

于 2009-04-10T11:35:13.440 に答える