繁体   English   中英

Pyglet:blit_into纹理和alpha

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM