python - 在 Pyglet 中有没有办法将 Sprite 带到前台

标签 python python-3.x pyglet

我正在尝试将 Sprite 带到前景,以便它们位于图像的顶层。这是我用来分配图像值的行

ball = pyglet.sprite.Sprite(ball_image, 50, 50)

是否有我可以添加到这条线的属性,它将在前景上绘制图像?

编辑:我试图让第一张图片保持在前景中,无论它是在第二张图片之前还是之后绘制的。

最佳答案

您 (OP) 和两位评论者都没有意识到 GKBRK's answer实际上是您问题的适用解决方案。因为将你想要的东西渲染在最上面——最后——实际上会解决这个问题。

OpenGL 没有预定义的“图层”。这要由开发商来解决。 OpenGL 的唯一目的是按照一组预定义的规则与图形卡进行通信。您使用这些规则来创建您理解的内容,将其传递给 OpenGL,然后将其转换为显卡可以理解的内容。

您只需创建一个包含前景的占位符(一个变量),然后渲染要渲染的对象链中的最后

通常这个占位符是 Pyglet Batch .

它的工作原理是:

import pyglet

key = pyglet.window.key

class main(pyglet.window.Window):
    def __init__ (self, width=800, height=600, fps=False, *args, **kwargs):
        super(main, self).__init__(width, height, *args, **kwargs)
        self.x, self.y = 0, 0

        ## == an example of batched rendering:
        self.main_batch = pyglet.graphics.Batch()

        ## == Set up two ordered groups.
        ##    Again, you still have to place the foreground LAST in the queue.
        self.background = pyglet.graphics.OrderedGroup(0)
        self.foreground = pyglet.graphics.OrderedGroup(1)

        self.bg = pyglet.sprite.Sprite(pyglet.image.load('background.png'), batch=self.main_batch, group=self.background)

        self.sprites = {}
        self.sprites['player'] = pyglet.sprite.Sprite(pyglet.image.load('player.png'), batch=self.main_batch, group=self.foreground, x = 10, y = 50)
        self.sprites['enemy'] = pyglet.sprite.Sprite(pyglet.image.load('foe.png'), batch=self.main_batch, group=self.foreground, x = 50, y = 200)

        self.x = pyglet.sprite.Sprite(pyglet.image.load('foreground.png'), batch=self.main_batch, group=self.foreground, x=200, y=400)

        self.alive = 1

    def on_draw(self):
        self.render()

    def on_close(self):
        self.alive = 0

    def on_key_press(self, symbol, modifiers):
        if symbol == key.ESCAPE: # [ESC]
            self.alive = 0

    def render(self):
        ## == Clear the frame
        self.clear()

        self.main_batch.draw()

        ## == And flip the current buffer to become the active viewed buffer.
        self.flip()

    def run(self):
        while self.alive == 1:
            self.render()

            # -----------> This is key <----------
            # This is what replaces pyglet.app.run()
            # but is required for the GUI to not freeze
            #
            event = self.dispatch_events()

x = main()
x.run()

但你也可以这样做:

def render():
    self.clear()
    self.bg.draw()
    for s_name, sprite_object in self.sprites.items():
        sprite_object.draw()
    self.foreground.draw()
    self.flip()

本质上是一样的..但是慢很多。

但我支持 GKBRK 的回答;这是正确的..并且由于 OP 中绝对缺少代码 - 很难给出任何代码作为示例,除非你碰巧坐在一些代码上(就像我一样)。

我的代码不一定适用于 OP 的代码 - 因此这很可能只是令人困惑或与代码风格不匹配。但这至少是它的工作原理。

关于python - 在 Pyglet 中有没有办法将 Sprite 带到前台,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45351555/

相关文章:

python - 如何在同一行(shell 或窗口)中每次使用不同的输出重新打印 2D 数组或多个输出 [Python 3.x]?

python-3.x - 带有 Voila 的 Ipywidgets 未显示 : ERROR tornado Uncaught exception GET

python - 重复列表创建指定形状的 numpy 数组

python - @pyglet.window.Window.event 如何工作?

python - 如何使用 glDrawArrays 和 glVertexPointer?

python - GtkTreeView 的行激活和光标改变信号

python - 改变 python 的面部和情绪

python - 如何在Python中使用pyglet库中的batch.draw()绘制 Sprite

python - 我应该将玩家信息存储在服务器还是客户端?

python - 用于 Python 3.x 的 MySQL-db 库?