在Pyglet中有将精灵带到前台的方法

时间:2017-07-27 12:59:27

标签: python python-3.x pyglet

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

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

是否有可以添加到此行的属性将在前景上绘制图像?

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

2 个答案:

答案 0 :(得分:4)

您(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的代码 - 所以这很可能只是令人困惑或者代码风格不匹配。但这至少是它的工作原理。

答案 1 :(得分:2)

绘制想要在底部精灵之后的顶部精灵应该达到你想要的效果。