web-dev-qa-db-ja.com

ブリットと少し混同(Pygame)

私はいくつかのpygameを学習し始めたばかりです(全体的にプログラミングはまったく新しい)、そしてそれがどのように機能するかについていくつかの非常に基本的な質問があります。

画面に特定のサーフェスを含めるかどうかを決定する必要がある場合を説明する場所はまだ見つかりません。たとえば、円を描く場合:

_circle = pygame.draw.circle(screen, (0, 0, 0), (100, 100), 15, 1)
_

screen.blit(circle)を実行する必要はありませんが、テキストを表示する場合:

_text = font.render("TEXT", 1, (10, 10, 10)) 
textpos = text.get_rect()
textpos.centerx = screen.get_rect().centerx
screen.blit(text, textpos)
_

ブリットしないと、テキストは表示されません。

正直に言うと、画面に目的の表面を「貼り付ける」ことを除けば、ブリットが何をするべきか本当にわかりません。十分に明確になったことを願っています。

22
Pabce

短い答え

画面に特定のサーフェスを含めるかどうかを決定する必要がある場合を説明する場所はまだ見つかりません。

各操作の動作は異なるため、使用している機能のドキュメントを読む必要があります。

長い答え

ブリッティングとは

まず、ブリットが何をしているのかを理解する必要があります。画面は単なるピクセルのコレクションであり、ブリッティングはあるピクセルのセットを別のピクセルに完全にコピーします。たとえば、ハードドライブから読み込んだ画像を含むサーフェスを作成し、screenサーフェスの上にそのサーフェスを複数回ブリットすることで、スクリーン上のさまざまな位置に複数回表示できます。

だから、あなたはしばしばこのようなコードを持っています...

_my_image = load_my_image()
screen.blit(my_image, position)
screen.blit(my_image, another_position)
_

2行のコードで、ソースサーフェス(my_image)から大量のピクセルを「ブリッティング」によって画面にコピーしました。

Pygame.draw。*関数はどのようにブリットしますか?

技術的には、pygame.draw。*メソッドは、同様のことを行うために記述できた可能性があります。だから、あなたの例の代わりに...

_pygame.draw.circle(screen, COLOR, POS, RADIUS, WIDTH)
_

...彼らはあなたにこれをしてもらうことができました...

_circle_surface = pygame.draw.circle(COLOR, RADIUS, WIDTH)
screen.blit(circle_surface, POS)
_

この場合、同じ結果が得られます。ただし、内部的には、pygame.draw.circle()メソッドは、新しいサーフェスを作成するのではなく、渡すサーフェスを直接操作します。これは、新しいサーフェスを作成するよりも速く、または少ないメモリで実行できるため、物事を行う方法として選択された可能性があります。

それで私はどちらをしますか?

したがって、「ブリットするタイミング」と「しないタイミング」という質問には、基本的に、ドキュメントを読んで、関数が実際に何をするかを確認する必要があります。

pygame.draw.circle() のドキュメントは次のとおりです。

pygame.draw.circle():

点の周りに円を描く

円(表面、色、位置、半径、幅= 0)->長方形

Surfaceに円形を描画します。 pos引数は円の中心であり、radiusはサイズです。 width引数は、外側のEdgeを描画する厚さです。幅がゼロの場合、円は塗りつぶされます。

「表面に図形を描く」と書かれているので、ピクセルの変更はすでに行われていることに注意してください。また、サーフェスを返しません(Rectを返しますが、ピクセルの変更が行われた場所を示しているだけです)。

では、 pygame.font.Font.render()documentation を見てみましょう。

新しいサーフェスにテキストを描く

render(テキスト、アンチエイリアス、色、背景=なし)->表面

これにより、指定されたテキストがレンダリングされた新しいSurfaceが作成されます。 Pygameは既存のSurfaceに直接テキストを描画する方法を提供していません。代わりにFont.render()を使用してテキストの画像(Surface)を作成し、この画像を別のSurfaceにブリットする必要があります。 ...

ご覧のとおり、テキストは新しいサーフェスに描画され、作成されて返されます。この表面は画面の表面ではありません(できません。画面の表面がrender()関数にわからないこともあります)。これは、実際にこの表面を画面にブリットする必要があることを示す非常に良い兆候です。

45
Mark Hildreth

ブリットは「BL'ock」「I'mage」「T'ranfser」を意味します

画面に物を表示するときは、何らかの方法でscreenを使用します。

行うとき:

pygame.draw.circle(screen, (0, 0, 0), (100, 100), 15, 1)

あなたはまだスクリーンを使用していますが、pygameはあなたのためにそれを描いているので、あなたはただブリットではありません。

また、テキストを使用する場合、pygameはそれを画像にレンダリングし、それからブリットする必要があります。

したがって、基本的には画像をブリットしますが、pygameで画像を描画することもできます。ただし、背景の上などで画像をブリットする場合は、4回ループバックする必要があることを忘れないでください。背景、画像、背景などをブリットするように...

それ以上のことを知る必要はありませんが、ここですべてを読むことができます Pygame Blit

これがお役に立てば幸いです。幸運を!

11
Serial

あなたが画家であると想像してください:

キャンバスとブラシがあります。

メイン画面の表面がキャンバスになり、他のすべての表面が「頭の中」にあるとしましょう。すでにそれらを描画する方法を知っています。

ブリットを呼び出すと、表面のをペイントし、オーバーラップしたピクセルをすべてカバーします。そのため、オブジェクト全体を黒く塗り直して、オブジェクトの移動中に絵に汚れが付かないようにする必要があります。

マークがすでに言ったように、関数で円を描くか、最初に新しい表面にブリットして、スクリーン表面にブリットすることができます。

より複雑なサーフェス-カーブ、テキストなどがある場合、そのためのサーフェスは必要ないので、高価な計算を行う必要はなく、描画するだけです。欠点は、プログラムがより多くのメモリを消費することであるため、これらの2つから選択する必要があります。