2017-09-04 9 views
1

私はpygletで簡単なアプリケーションを作ろうとしています。これまでの私の主な問題は、画像をアルファでblitできないように見えることです。透明ピクセルはすべて黒のピクセルに変換されます。問題が画像の読み込みであるのかブリッジであるのかはわかりません。画像をレンダリングする方法の基本的な概要は次のとおりです。pyglet - アルファ付きローディング/ blittingイメージ

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") 

bg.blit(0, 0) 
text.blit(100, 100) 

pyglet.app.run() 

助けていただければ幸いです。前もって感謝します。

答えて

2

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() 

は今、これは、この生成します

enter image description here

をそしてここであなたは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() 

この結果は次のようになります。

enter image description here

しかし、このコードはすぐに乱雑になります。
あなたにできることは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() 

enter image description here

BAM。

このコードを使用すると、後でたとえばカスタム機能やカスタムの「プレーヤーオブジェクト」を作成できます。また、コリジョン検出を簡単に行うことができ、コードはもっと構造化されたように見えます(キーボードやマウスイベントなどの小さなボーナス機能を使用しました)。

最後の画像に示すように、スプライトの位置はデフォルトでx=0, y=0になることに注意してください。変数/ハンドルまたはスプライトの作成時にx=100で位置を設定できます。

+0

私が言ったように、私は使っていたコードの非常に単純化されたバージョンを入れました。私は何年もこれをやってきた、Pythonでアプリケーションを作成する方法を知っています。あなたはすべての余分な情報を置く必要はありませんでしたが、とにかくそれをやってくれてありがとう。明確なupvote。 – nousername

+1

@nousername簡略版ではありませんでした。しかし、それでも少なくとも実行可能なバージョンに最小化されていればうまくいくでしょう:)最後に、他の人がここで終わるかもしれないので(かなり共通の話題なので)、徹底的な回答を残したほうがよいと思いました。アップヴォートとあなたのプロジェクトで最高の幸運のための乾杯:D – Torxed

関連する問題