如何使用批处理绘图()来自Python中的pyglet库

2024-05-16 11:13:13 发布

您现在位置:Python中文网/ 问答频道 /正文

这可能看起来像一个复制品,也许是,但我使用的是视窗10和雪碧.py只有v2i在一个地方,更改它并不能解决问题。 也许我用错了批绘图,所以我提供了代码。draw()是由on\u 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()

Tags: imageselfdefbatchloadrenderwidthpyglet
1条回答
网友
1楼 · 发布于 2024-05-16 11:13:13

问题是您没有将Sprites赋值给全局变量或类变量,所以它可能会在render()结束时删除Sprites(作为局部对象)

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()    

相关问题 更多 >