在 Pyglet 中有没有办法将精灵带到前台
In Pyglet is there way to bring sprites to foreground
我正在尝试将精灵置于前景,以便它们位于图像的顶层。这是我用来分配图像值的行
ball = pyglet.sprite.Sprite(ball_image, 50, 50)
是否有一个 属性 可以添加到这条线以在前景上绘制图像?
编辑:我试图让第一张图片保持在前景中,无论它是在第二张图片之前还是之后绘制的。
晚于底部精灵绘制您想要位于顶部的精灵应该可以完成您想要的。
您 (OP) 和两位评论者都没有意识到 GKBRK's answer 实际上是您问题的适用解决方案。因为将你想要的东西渲染在最上面 - 最后 - 实际上可以解决这个问题。
OpenGL 没有预定义 "layers"。这要由开发商来解决。 OpenGL 的唯一目的是按照一组预定义的规则与图形卡进行通信。您使用这些规则来创建您理解的内容,将其传递给 OpenGL,然后将其转换为显卡可以理解的内容。
您只需创建一个包含前景的占位符(一个变量),然后渲染要渲染的对象链中的last。
通常这个占位符是 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 的代码 - 因此这很可能只是令人困惑或与代码风格不匹配。但这至少是它的工作原理。
我正在尝试将精灵置于前景,以便它们位于图像的顶层。这是我用来分配图像值的行
ball = pyglet.sprite.Sprite(ball_image, 50, 50)
是否有一个 属性 可以添加到这条线以在前景上绘制图像?
编辑:我试图让第一张图片保持在前景中,无论它是在第二张图片之前还是之后绘制的。
晚于底部精灵绘制您想要位于顶部的精灵应该可以完成您想要的。
您 (OP) 和两位评论者都没有意识到 GKBRK's answer 实际上是您问题的适用解决方案。因为将你想要的东西渲染在最上面 - 最后 - 实际上可以解决这个问题。
OpenGL 没有预定义 "layers"。这要由开发商来解决。 OpenGL 的唯一目的是按照一组预定义的规则与图形卡进行通信。您使用这些规则来创建您理解的内容,将其传递给 OpenGL,然后将其转换为显卡可以理解的内容。
您只需创建一个包含前景的占位符(一个变量),然后渲染要渲染的对象链中的last。
通常这个占位符是 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 的代码 - 因此这很可能只是令人困惑或与代码风格不匹配。但这至少是它的工作原理。