[英]Pyglet: blit_into texture and alpha
我一直在使用pyglet一段时间,我真的很喜欢它。 不过,我有一件事我想做但却无法做到。
我正在开发一个2D角色扮演游戏,我希望这些角色能够看起来不同 - 也就是说,我不喜欢使用完全预先构建的精灵,但我希望它能有一系列的比方说,发型和装备,在游戏中的角色上可见。
所以为了让这个东西起作用,我认为最有效的方法是用pyglet.image.Texture.create()创建一个纹理,并使用Texture.blit_into在该纹理上创建正确的精灵源图像。 例如,我可以在纹理上显示裸露的人体图像,然后在其上点亮头发纹理,等等。
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)
问题是将第二个图像blit到纹理中“覆盖”已经嵌入的纹理。即使两个图像都有一个alpha通道,但是hair_style在它上面是blit之后,下面的图像(human_base)是不可见的。
一读这可能会想知道为什么这样做,而不是创建两个不同的pyglet.sprite.Sprite对象,一个用于human_base,另一个用于hair_style,只需将它们移动到一起即可。 有一点是绘制顺序:游戏是基于图块和等距的,因此对包含不同图层(或有序组,如pyglet称之为)的多个精灵组成的可见对象进行排序将是一个主要的痛苦。
所以我的问题是,有没有办法在使用pyglet使用blit_into时保留alpha。 如果没有办法做到这一点,那么,非常感谢任何有关此方法的替代方法的建议!
正确设置混合功能应该解决这个问题:
pyglet.gl.glBlendFunc(pyglet.gl.GL_SRC_ALPHA,pyglet.gl.GL_ONE_MINUS_SRC_ALPHA)
我遇到了同样的问题,找不到合适的解决方案。 显然将两个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(或列或行或矩形框),则可以使用裁剪功能。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.