如何使用 Python 中的 pyglet 库中的 batch.draw() 绘制精灵
How to draw sprites using batch.draw() from pyglet library in Python
这看起来像是重复的,也许是,但我使用的是 windows 10,而 sprite.py 只有一个地方有 v2i,更改它并不能解决问题。
也许我使用了错误的批量绘图,所以我提供了代码。 on_draw() 函数从游戏对象调用 draw()。
class Island:
def __init__(self):
self.island = [[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],]
self.tile_width = 30
self.offsetx = 350
self.offsety = 100
self.batch = pyglet.graphics.Batch()
self.water_tile = pyglet.image.load("path")
self.grass_tile = pyglet.image.load("path")
self.render_phase = True
def render(self):
for i in range(len(self.island)):
for j in range(len(self.island[i])):
if self.island[i][j] == 0:
x = j*self.tile_width - i*self.tile_width + self.offsetx
y = int((j*self.tile_width+i*self.tile_width)/2+self.offsety)
pyglet.sprite.Sprite(self.water_tile, x, y, batch=self.batch)
elif self.island[i][j] == 1:
x = j * self.tile_width - i * self.tile_width + self.offsetx
y = int((j * self.tile_width + i * self.tile_width) / 2 + self.offsety)
pyglet.sprite.Sprite(self.grass_tile, x, y, batch=self.batch)
def draw(self):
if self.render_phase:
self.render()
self.render_phase = False
else:
self.batch.draw()
问题是您没有将 Sprites
分配给全局或 class 变量,因此它可能会在结束时删除 Sprites
(作为本地对象)render()
def __init__(self):
self.all_sprites = []
def render(self):
s = pyglet.sprite.Sprite(self.water_tile, x, y, batch=self.batch)
self.sprites.append(s)
完整示例 - 尝试使用和不使用 self.sprites.append(s)
import pyglet
class Island:
def __init__(self):
self.my_batch = pyglet.graphics.Batch()
self.image = pyglet.image.load("image.jpg")
self.all_sprites = []
self.render()
def render(self):
for y in range(0, 100, 30):
for x in range(0, 100, 30):
s = pyglet.sprite.Sprite(self.image, x, y, batch=self.my_batch)
self.all_sprites.append(s) # <-- try without this line
def draw(self):
print('island.draw()')
self.my_batch.draw()
window = pyglet.window.Window()
island = Island()
@window.event()
def on_draw():
window.clear()
island.draw()
pyglet.app.run()
这看起来像是重复的,也许是,但我使用的是 windows 10,而 sprite.py 只有一个地方有 v2i,更改它并不能解决问题。 也许我使用了错误的批量绘图,所以我提供了代码。 on_draw() 函数从游戏对象调用 draw()。
class Island:
def __init__(self):
self.island = [[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],]
self.tile_width = 30
self.offsetx = 350
self.offsety = 100
self.batch = pyglet.graphics.Batch()
self.water_tile = pyglet.image.load("path")
self.grass_tile = pyglet.image.load("path")
self.render_phase = True
def render(self):
for i in range(len(self.island)):
for j in range(len(self.island[i])):
if self.island[i][j] == 0:
x = j*self.tile_width - i*self.tile_width + self.offsetx
y = int((j*self.tile_width+i*self.tile_width)/2+self.offsety)
pyglet.sprite.Sprite(self.water_tile, x, y, batch=self.batch)
elif self.island[i][j] == 1:
x = j * self.tile_width - i * self.tile_width + self.offsetx
y = int((j * self.tile_width + i * self.tile_width) / 2 + self.offsety)
pyglet.sprite.Sprite(self.grass_tile, x, y, batch=self.batch)
def draw(self):
if self.render_phase:
self.render()
self.render_phase = False
else:
self.batch.draw()
问题是您没有将 Sprites
分配给全局或 class 变量,因此它可能会在结束时删除 Sprites
(作为本地对象)render()
def __init__(self):
self.all_sprites = []
def render(self):
s = pyglet.sprite.Sprite(self.water_tile, x, y, batch=self.batch)
self.sprites.append(s)
完整示例 - 尝试使用和不使用 self.sprites.append(s)
import pyglet
class Island:
def __init__(self):
self.my_batch = pyglet.graphics.Batch()
self.image = pyglet.image.load("image.jpg")
self.all_sprites = []
self.render()
def render(self):
for y in range(0, 100, 30):
for x in range(0, 100, 30):
s = pyglet.sprite.Sprite(self.image, x, y, batch=self.my_batch)
self.all_sprites.append(s) # <-- try without this line
def draw(self):
print('island.draw()')
self.my_batch.draw()
window = pyglet.window.Window()
island = Island()
@window.event()
def on_draw():
window.clear()
island.draw()
pyglet.app.run()