2015-09-12 71 views
2

我一直在使用pyglet一段時間,我非常喜歡它。然而,我有一件事想做,但迄今爲止還做不到。Pyglet:blit_into紋理和alpha

我正在製作一個2D角色扮演遊戲,我希望角色能夠看起來不同 - 也就是說,我不喜歡使用完全預構造的小精靈,但是我想要那裏可以說是一系列髮型和裝備,可以在遊戲中的角色上看到。所以爲了讓這件事情起作用,我認爲關於它的最明智的方法是用pyglet.image.Texture.create()創建一個紋理,並使用Texture在該紋理上blit正確的精靈源圖像.blit_into。例如,我可以的blit紋理上的裸體人體圖像,然後對的blit一個頭發紋理等

human_base = pyglet.image.load('x/human_base.png').get_image_data() 
hair_style = pyglet.image.load('x/human_hair1.png').get_image_data() 

texture = pyglet.image.Texture.create(width=human_base.width,height=human_base.height) 

texture.blit_into(human_base, x=0, y=0, z=0) 
texture.blit_into(hair_style, x=0, y=0, z=1) 

sprite = pyglet.sprite.Sprite(img=texture, x=0, y=0, batch=my_sprite_batch) 

的問題是塊傳輸的第二圖像到紋理「覆蓋」在已經位圖混合紋理。儘管這兩個圖像都有一個alpha通道,但在hair_style在blit之後,下面的圖像(human_base)不可見。

一個讀者可能想知道爲什麼要這樣做,而不是創建兩個不同的pyglet.sprite.Sprite對象,一個用於human_base,另一個用於hair_style並將它們移動到一起。有一件事是繪製順序:遊戲是基於圖塊和等距的,所以對由多個不同圖層組成的可見對象(如pyglet稱之爲有序組)進行排序會是一大痛苦。

所以我的問題是,是否有一種方法來保留alpha時使用blit_into與pyglet。如果沒有辦法做到這一點,請對任何有關此方法的建議感到非常感激!

回答

0

正確設置混合函數應該解決這個問題:

pyglet.gl.glBlendFunc(pyglet.gl.GL_SRC_ALPHA,pyglet.gl.GL_ONE_MINUS_SRC_ALPHA) 
0

我碰到了同樣的問題,但沒有找到一個妥善的解決辦法。顯然,將兩個RGBA圖像/紋理重疊在一起將會刪除下面的圖像。我提出的另一個想法是將每個角色的每個「服裝形象」作爲一個獨立的精靈貼在批次和團體上,但這遠不是最優化的,並大大降低了FPS。

我有我自己的解決方案通過使用PIL

import pyglet 
from PIL import Image 
class main(pyglet.window.Window): 
    def __init__ (self): 
     TILESIZE = 32 
     super(main, self).__init__(800, 600, fullscreen = False) 
     img1 = Image.open('under.png') 
     img2 = Image.open('over.png') 
     img1.paste(img2,(0,0),img2.convert('RGBA')) 
     img = img1.transpose(Image.FLIP_TOP_BOTTOM) 
     raw_image=img.tostring() 
     self.image=pyglet.image.ImageData(TILESIZE,TILESIZE,'RGBA',raw_image) 

    def run(self): 
     while not self.has_exit: 
      self.dispatch_events() 
      self.clear() 
      self.image.blit(0,0) 
      self.flip() 
x = main() 
x.run() 

這很可能不是最佳的解決方案,但如果你在現場裝載做裝載,那麼就無所謂了,其結果你幾乎可以做任何你想做的事情(只要你不把它放在另一個紋理上,嘿)。如果你想從PIL的tileset中取出1個tile(或一列或一行或一個矩形框),可以使用裁切功能。