<p>我以前在为我的一个3D程序制作GUI时做过类似的事情。为了使事情变得非常简单,我首先在draw()调用之前关闭GL_DEPTH_TEST,然后在draw()调用之后重新启用GL_DEPTH_TEST。我相信之前的答案对他们有用的原因是因为他们一开始没有启用GL_DEPTH_测试。我创建了一个<strong>按钮类</strong>,你也可以使用它(需要注意的是,参数“pos”是按钮左下角的(x,y)坐标,而参数“dim”是按钮的(宽度、高度)尺寸。“texture_coords”参数引用按钮背景图像的纹理坐标。如果需要完整的图像,只需将其保留为默认值。其余的都是不言而喻的)。代码如下:</p>
<pre><code>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)
</code></pre>
<p>我希望这是有益的!在</p>
<p>~里克·鲍恩</p>