我正在尝试将精灵带到前景,以便它们位于图像的顶层。这是我用来分配图像值的行
ball = pyglet.sprite.Sprite(ball_image, 50, 50)
是否有可以添加到此行的属性将在前景上绘制图像?
编辑:我试图让第一张图像保持在前景,无论它是在第二张图像之前还是之后绘制的。
答案 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)
绘制想要在底部精灵之后的顶部精灵应该达到你想要的效果。