[英]Pyglet : Render multiple object in a batch
我想知道在 pyglet 中如何批量渲染多个对象。
我尝试从 ball 类编辑 init 但我没有成功更改它我如何访问 init 因为如果我放置 batch=batch 它会创建一个错误。 不知道清楚了没有...
这是我的代码,我有以下错误:
__init__() got an unexpected keyword argument 'batch'
我的代码
from pyglet import *
from pyglet.gl import *
import particles as prt
# Indented oddly on purpose to show the pattern:
UP = 0b0001
DOWN = 0b0010
LEFT = 0b0100
RIGHT = 0b1000
class ball(pyglet.sprite.Sprite):
def __init__(self, parent, image='Red_Circle.png', x=0, y=0):
self.texture = pyglet.image.load(image)
pyglet.sprite.Sprite.__init__(self, self.texture, x=x, y=y)
self.parent = parent
self.direction = UP | RIGHT # Starting direction
def update(self,scalef=None):
if scalef is not None:
self._scale = scalef
# We can use the pattern above with bitwise operations.
# That way, one direction can be merged with another without collision.
if self.direction & UP:
self.y += 1
if self.direction & DOWN:
self.y -= 1
if self.direction & LEFT:
self.x -= 1
if self.direction & RIGHT:
self.x += 1
if self.x+self.width > self.parent.width:
self.direction = self.direction ^ RIGHT # Remove the RIGHT indicator
self.direction = self.direction ^ LEFT # Start moving to the LEFT
if self.y+self.height > self.parent.height:
self.direction = self.direction ^ UP # Remove the UP indicator
self.direction = self.direction ^ DOWN # Start moving DOWN
if self.y < 0:
self.direction = self.direction ^ DOWN
self.direction = self.direction ^ UP
if self.x < 0:
self.direction = self.direction ^ LEFT
self.direction = self.direction ^ RIGHT
def render(self):
self.draw()
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
batch = pyglet.graphics.Batch()
ball_sprites = []
for i in range(100):
x, y = i * 10, 50
ball1= ball(x, y)
ball_sprites.append(ball1)
print(ball_sprites)
self.ball = ball(self, x=100, y=100)
self.alive = 1
def on_draw(self):
self.render()
def on_close(self):
self.alive = 0
def render(self):
self.clear()
self.ball.update(0.01)
self.ball.update()
self.ball.render()
self.flip()
def run(self):
while self.alive == 1:
self.render()
event = self.dispatch_events()
if __name__ == '__main__':
x = main()
x.run()
谢谢 !
您当前的设置有很多问题。
您需要将批次传递给球,并且您的 init 需要支持它。
您不需要run
功能。 使用pyglet.app.run()
,它会自动处理所有事情。 从您的设置来看,您似乎正在绘制渲染两次或更多次。
确保在 init 和 sprite init 上都允许批处理。
def __init__(self, parent, image='Red_Circle.png', x=0, y=0, batch=batch):
self.texture = pyglet.image.load(image)
pyglet.sprite.Sprite.__init__(self, self.texture, x=x, y=y, batch=batch)
然后确保在创建ball
时传递批次。
看一个实际例子可能会更好: https : //github.com/pyglet/pyglet/blob/ae8228d56ed6f0855f6280cc44b22d057d92dc4d/examples/media/noisy/noisy.py
这是一个使用带有弹跳球的 Pyglet 并使用批处理的示例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.