2011-09-12 1 views
1

私は、スクリーンのリフレッシュのたびにいくつかのレイヤーを重ねて表示する、python/pygameを使って2Dゲームを作成しようとしています。 、表面(非透明)残り pygameアルファ層を効率的にクリアするにはどうすればよいですか?

  • Midgroundとは異なるレートでスクロール:

    • 背景:私の基本的な設定は、(下から上に)である(静的)SRCALPHA透明な表面
    • プレーヤー/スプライト/敵:スプライトグループ
    • Forground:SRCALPHA透明な表面(静的)

    は今、私はこれらの4層別ごとに画面の上部に1つずつ、ブリットよ。バックグラウンドは他の3つのレイヤーとは異なるレートでスクロールします。そのため、私はそれをミッドグラウンドから分離しています。今のゲームは構造化されているので、60fpsのかなり控えめなノートパソコンで動作します。

    -BUT-スプライトグループに問題があります。スプライトグループには直接画面にブリッジしています。私の現在のビューポートに従ってすべてのスプライトのrectを調整することは、物事をプログラムするための醜い方法のように思えます。私はより洗練されたソリューションを望みます。

    スプライトを私が管理できる別の透明な表面にブリットしたいのですが、テリンは私の問題です。私のパフォーマンスの半分でない透明なレイヤーをクリアする方法は見つけられません。私が試したセットアップの一部:

    私はブレンドモードrgba_subと白の表面に層を充填しようとした
    • (surf.fill((255255255255)は、エリア、BLEND_RGBA_SUBは)) - これは、スーパーです
    • スーパースロー私は、ブランク表面のsurface.copyを()しようとした - これは高速ですが、それでも私はmidground層とスプライトを組み合わせ、にpyg​​ame.sprite.LayeredUpdatesを使用して試してみた私のfpsの
    • を半減しますスプライトを更新します。これはパフォーマンスには影響しませんが、ミッドグラウンドが透過的な場所では機能しません。私は背景レイヤーの上にスプライトのトレイルを取得します。

    私が今までに見つけた最良の解決策は、スプライトを直接画面に描画する現在の設定です。それは素晴らしく、高速で実行されますが、管理する痛みです。各スプライトの矩形がフレームごとにビューポートに合わせて調整されていることを確認する必要があります。また、衝突の検出も困難です。

    パイガームの透明な表面をクリアするもう1つの素早い方法がありますか?早くに60回以上行うことができますか?また、同じ効果が得られるレイヤーの設定はありますか?

  • 答えて

    1

    私は層に選択的にピーターのソリューションを適用することにより、スプライト透明層のみをクリアする高速な方法を考え出し:

    for s in self.level.sprites: 
        spritelayer.fill((0), s.rect) 
    

    これは(すべて、各フレームを消去する)正常に動作しているようだと、まだ60fpsの時に実行されます。

    1

    Surface.fill()は、すべてのR、G、B、およびAの値をクリアします。

    >>> img = pygame.image.load("hasalpha.png") 
    >>> print img.get_at((300, 300)) 
    (238, 240, 239, 255) 
    >>> surface.fill(0) 
    >>> print img.get_at((300, 300)) 
    (0, 0, 0, 0) 
    

    これは、あなたが何を記述しているかのように聞こえます。アルファ値でより具体的な何かをしようとするならば、pygame.surfarray.pixel関数はあなたに直接編集可能な値を与えることができます。それは速くなりますが、依存性としてnumpyが必要です。

    +0

    これはsurf.fill((255,255,255,255)、area、BLEND_RGBA_SUB)よりも速く実行されているようですが、レイヤ全体で実行すると半分のパフォーマンスが得られます。 – drinkdecaf

    +0

    ああ!しかし、私がスプライトの矩形にのみ適用すると、速く走ります:Dありがとうございます! – drinkdecaf

    関連する問題