3

現在、作業中の小さなプロジェクト用にいくつかのGUIコードを作成しており、スクロールバーとそれに関連するコンテナーを実装する必要があります。実行を簡単にするために、「スクロールボックス」(スクロールバーが影響するウィンドウ)内のすべての要素を、メインの表示面とは別の面に描画できるようにしたいと思います。次に、別のサーフェスが必要に応じてトリミングされ、レンダリングループの表示サーフェスに描画されます。ただし、これを機能させるのに問題があります。

私のクラスのdraw()メソッドには、次のコードがあります。ScrollBox

def draw(self):
    self.subSurface.blit(self.image, (x, y)) 
    #subSurface is, naturally, a Surface, and image is a pygame.Image; x and y are whatever
    self.displaySurface.blit(self.subSurface, (x,y))

私のコードのすべての描画可能なGUI要素と同様にdraw()、メインのレンダリングループを通過するたびに呼び出されます。上記のコードが私に与えるのは、デフォルトの塗りつぶされた黒いRectでありself.image、どの容量でも表示されません。最初の行を次のように置き換えてみました

pygame.draw.rect(self.subSurface, color, rect)

しかし、同じ結果が得られました。他のPygameGUIライブラリを読んだところ、やりたいことは可能だと思いますが、正しく実行されていないと思います。他のソース/サーフェスをアタッチしてから(ソースをアタッチした状態で)描画するにはどうすればよいsubSurfaceですか?subSurfacedisplaySurface

どんな助けでも大歓迎です。ありがとう。

4

1 に答える 1

2

将来この質問にアクセスする人のために:

dest引数Surface.blit()は、宛先サーフェスの左上隅を基準にしていることに注意してください。したがって、地下で画像を組み立てる場合は、絶対表示座標ではなく、組み立てるオブジェクトの左上隅を基準にした座標を使用することを忘れないでください。

したがって、スクロールバーを組み立ててどこかに描画するには、次のようにします。

class ScrollBar:
    # ... code ...
    def render(self, display, x, y):
        self.subSurface.blit(self.handle_image, (0, self.handle_pos))
        self.subSurface.blit(self.upbtn_image, (0, 0))
        self.subSurface.blit(self.dnbtn_image, (0, self.height - self.btn_height))
        # ... other rendering operations
        display.blit(self.subSurface, (x, y))

すべての数値と変数名を好みに合わせて調整しますが、あなたはその考えを理解します。すべてのスクロールバー要素が「スクロールバー-ローカル」座標に配置され、画面/アプリケーション座標に配置された表示面への最後のブリットのみが配置されていることに注意してください。

于 2013-01-02T22:50:28.070 に答える