Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pyglet文本背景不透明_Python_Image_Text_Draw_Pyglet - Fatal编程技术网

Python Pyglet文本背景不透明

Python Pyglet文本背景不透明,python,image,text,draw,pyglet,Python,Image,Text,Draw,Pyglet,我正在使用Pyglet为我的python游戏创建一个主菜单。我想在一个盒子的顶部绘制文本,作为它的容器。每当我渲染文本时,它都会绘制glClearColor设置为的任何内容,而不是透明背景。每当我试图画一幅没有背景的图像时,这种情况也会发生 我目前正在使用这两行作为我的文本框和文本 self.text_box = pyglet.sprite.Sprite(pyglet.image.load('../Resources/Textures/Menu/text_box.png'),640-150,36

我正在使用Pyglet为我的python游戏创建一个主菜单。我想在一个盒子的顶部绘制文本,作为它的容器。每当我渲染文本时,它都会绘制glClearColor设置为的任何内容,而不是透明背景。每当我试图画一幅没有背景的图像时,这种情况也会发生

我目前正在使用这两行作为我的文本框和文本

self.text_box = pyglet.sprite.Sprite(pyglet.image.load('../Resources/Textures/Menu/text_box.png'),640-150,360-25, batch=self.menuBatch,group=boxGroup)

self.play_text = pyglet.text.Label("Play", font_name="Arial", font_size=32, x=640, y=360, anchor_x='center', anchor_y='center', color=(255,255,255,255), batch=self.menuBatch,group=textGroup)
然后我只调用self.menuBatch.draw()。我遇到的问题是:


要使透明效果发挥作用,应在OpenGL中启用“混合”

要启用混合,请执行以下操作:

glEnable(GL_BLEND)                                  # transparency
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)   # transparency
这段完整的代码片段适合我:

import pyglet
from pyglet.gl import *


# Pyglet Window stuff ---------------------------------------------------------
batch = pyglet.graphics.Batch()  # holds all graphics
config = Config(sample_buffers=1, samples=4,depth_size=16, double_buffer=True, mouse_visible=False)
window = pyglet.window.Window(fullscreen=False, config=config)

glClearColor(  0, 100,   0, 255)  # background color
glEnable(GL_LINE_SMOOTH)
glHint(GL_LINE_SMOOTH_HINT, GL_DONT_CARE)
glEnable(GL_BLEND)                                  # transparency
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)   # transparency

play_text = pyglet.text.Label("Play", font_name="Arial", font_size=32, x=240, y=140, anchor_x='center', anchor_y='center', color=(255,0,255,255), batch=batch,group=None)
text_box = pyglet.sprite.Sprite(pyglet.image.load('text_box.png'),240-150,160-25, batch=batch,group=None)

@window.event
def draw(dt):
    window.clear()
    batch.draw()


if __name__ == "__main__":
    pyglet.clock.schedule_interval(draw, 1.0/60)
    pyglet.app.run()

在为我的一个3D程序制作GUI时,我做过类似的事情。为了使事情变得非常简单,我首先在draw()调用之前关闭了GL_DEPTH_测试,然后在draw()调用之后重新启用了GL_DEPTH_测试。我相信前面的答案对他们有效的原因是因为他们一开始没有启用GL_DEPTH_测试。我制作了一个按钮类,你也可以使用它(注意参数“pos”表示按钮左下角的(x,y)坐标,参数“dim”表示按钮的(宽度,高度)尺寸参数指的是按钮背景图像的纹理坐标。如果您想要完整图像,只需将其保留为默认值。其余的都是不言自明的)。下面是代码:

class Button:
    def __init__(self, btn_img_file, text = "Button", pos = (0, 0), dim = (10, 10), text_color = (255, 255, 255), texture_coords = (0, 0, 1, 0, 1, 1, 0, 1)):
        self.x, self.y = pos
        self.w, self.h = dim
        self.text = text
        self.img = btn_img_file
        self.tex = get_tex(self.img)
        self.coords = texture_coords
        self.color = text_color
        self.batch = pyglet.graphics.Batch()

    def on_click(self, mouse_x, mouse_y, function, *args, **kwargs):
        x, y = self.x, self.y
        X, Y = x + self.w, y + self.h
        if mouse_x > x and mouse_x < X and mouse_y > y and mouse_y < Y:
            function(*args, **kwargs)

    def draw(self):
        x, y = self.x, self.y
        X, Y = x + self.w, y + self.h
        font_size = (self.w // len(self.text)) - 5
        label = pyglet.text.Label(self.text,
            font_name = 'Times New Roman',
            font_size = font_size,
            x = x + (self.w // 2), y = y + (self.h // 2),
            anchor_x = 'center', anchor_y = 'center',
            color = (*self.color, 255))
        self.batch.add(4, GL_QUADS, self.tex, ('v2f', (x, y, X, y, X, Y, x, Y)), ('t2f', self.coords))
        glDisable(GL_DEPTH_TEST)
        self.batch.draw()
        label.draw()
        glEnable(GL_DEPTH_TEST)
class按钮:
定义初始化(self,btn\u img\u文件,text=“Button”,pos=(0,0),dim=(10,10),text\u color=(255,255),texture\u coords=(0,0,1,0,1,1)):
self.x,self.y=pos
self.w,self.h=dim
self.text=文本
self.img=btn\u img\u文件
self.tex=get_tex(self.img)
self.coords=纹理坐标
self.color=文本颜色
self.batch=pyglet.graphics.batch()
单击时定义(self、鼠标x、鼠标y、函数、*args、**kwargs):
x、 y=self.x,self.y
十、 Y=X+self.w,Y+self.h
如果鼠标_x>x且鼠标_xy且鼠标_y
我希望这是有帮助的


~Rick Bowen

这似乎对我不起作用。我用文本和透明图片尝试了这一点,但都没有做任何事情。修改了答案,添加了适合我的完整代码。除了openGL设置之外,我从您的代码中更改的唯一一件事是两个“组”都设置为“无”。什么是
textGroup
boxGroup
?它们的性质是什么?另外,
text\u box.png
在棋盘格背景下看什么?这两个组只是OrderedGroup
boxGroup=pyglet.graphics.OrderedGroup(1)textGroup=pyglet.graphics.OrderedGroup(0)
text_box.png
只是一个填充到其高度和宽度的灰色矩形。哦,灰色背景应该在那里,但黑色背景不在那里?没错。黑色是glClearColor的颜色。