GL ALPHAブレンドを有効にする必要があります。
from pyglet.gl import *
glEnable(GL_BLEND)
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
まず最初に、コードを実行することはできません。 ほとんどの場合、通常は物をレンダリングするon_draw
を処理するために、window.event
関数を宣言していないためです。
第2に、ウィンドウをクリアすることはありません(混乱の原因になります)。ここで
はあなたのコードの最小限の作業例です:
import pyglet
import pyglet.clock
window = pyglet.window.Window()
window.config.alpha_size = 8
#fancy text
text = pyglet.resource.image("text.png")
#background image
bg = pyglet.resource.image("bg.png")
@window.event
def on_draw():
window.clear()
bg.blit(0, 0)
text.blit(100, 100)
pyglet.app.run()
は今、これは、この生成します
をそしてここであなたはGL_BLEND機能の使用方法の作業例です:
を
import pyglet
import pyglet.clock
from pyglet.gl import *
window = pyglet.window.Window()
window.config.alpha_size = 8
#fancy text
text = pyglet.resource.image("text.png")
#background image
bg = pyglet.resource.image("bg.png")
@window.event
def on_draw():
window.clear()
glEnable(GL_BLEND)
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
bg.blit(0, 0)
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
text.blit(100, 100)
pyglet.app.run()
この結果は次のようになります。
しかし、このコードはすぐに乱雑になります。
あなたにできることは2つあります。まず、イメージをスプライトオブジェクトに配置します。第二に、これはもう少しオブジェクト指向にしてください。
まず、スプライトを使用します。
self.fancy_background = pyglet.sprite.Sprite(pyglet.image.load('bg.png'))
self.fancy_background.draw() # not blit!
Spritesは自動的に透明性を使用します。これにより、人生(およびコード)がより簡単になります。
第2に、これをバッチに入れます。
バッチでたくさんのスプライトが束ねられ、.draw()
をバッチに呼び出すことができ、そのバッチ内のすべてのスプライトがインスタントレンダリングされます。
self.background = pyglet.graphics.Batch()
self.fancy_background = pyglet.sprite.Sprite(pyglet.image.load('bg.png'), batch=self.background)
self.background.draw() # background, not fancy_background! And also not blit!!
最後に、最も重要なのは最後です。
これをクラスに入れて、後でクールなことをすることができます。
import pyglet
import pyglet.clock
from pyglet.gl import *
key = pyglet.window.key
class main(pyglet.window.Window):
def __init__ (self, width=800, height=600, fps=False, *args, **kwargs):
super(main, self).__init__(width, height, *args, **kwargs)
self.x, self.y = 0, 0
self.background = pyglet.graphics.Batch()
self.texts = pyglet.graphics.Batch()
self.fancy_background = pyglet.sprite.Sprite(pyglet.image.load('bg.png'), batch=self.background)
self.fancy_text = pyglet.sprite.Sprite(pyglet.image.load('text.png'), batch=self.texts)
self.mouse_x = 0
self.mouse_y = 0
self.alive = 1
def on_draw(self):
self.render()
def on_close(self):
self.alive = 0
def on_mouse_motion(self, x, y, dx, dy):
self.mouse_x = x
self.mouse_y = y
def on_mouse_press(self, x, y, button, modifiers):
if button == 1: # Left click
pass
def on_key_press(self, symbol, modifiers):
if symbol == key.ESCAPE: # [ESC]
self.alive = 0
def render(self):
self.clear()
self.background.draw()
self.texts.draw()
self.flip()
def run(self):
while self.alive == 1:
self.render()
# -----------> This is key <----------
# This is what replaces pyglet.app.run()
# but is required for the GUI to not freeze
#
event = self.dispatch_events()
if __name__ == '__main__':
x = main()
x.run()
BAM。
このコードを使用すると、後でたとえばカスタム機能やカスタムの「プレーヤーオブジェクト」を作成できます。また、コリジョン検出を簡単に行うことができ、コードはもっと構造化されたように見えます(キーボードやマウスイベントなどの小さなボーナス機能を使用しました)。
最後の画像に示すように、スプライトの位置はデフォルトでx=0, y=0
になることに注意してください。変数/ハンドルまたはスプライトの作成時にx=100
で位置を設定できます。
私が言ったように、私は使っていたコードの非常に単純化されたバージョンを入れました。私は何年もこれをやってきた、Pythonでアプリケーションを作成する方法を知っています。あなたはすべての余分な情報を置く必要はありませんでしたが、とにかくそれをやってくれてありがとう。明確なupvote。 – nousername
@nousername簡略版ではありませんでした。しかし、それでも少なくとも実行可能なバージョンに最小化されていればうまくいくでしょう:)最後に、他の人がここで終わるかもしれないので(かなり共通の話題なので)、徹底的な回答を残したほうがよいと思いました。アップヴォートとあなたのプロジェクトで最高の幸運のための乾杯:D – Torxed