Pyglet.image.ImageGrid() - 从左上角开始索引

Pyglet.image.ImageGrid() - indexing from top left

那里。

使用 pyglet.image.ImageGrid(),有没有什么方法可以从左上而不是左下开始网格?

所以,我目前唯一的 'awfull' 解决方案是:

  1. 垂直翻转驱动器上的图像
  2. 将图像作为纹理加载并使用 get_texture()
  3. 将其翻转回来
  4. 将其放入 ImageGrid()
  5. Reverse() ImageGrid 序列

这个问题已有 4 年历史,但由于它是 Google 上的最佳结果之一,我想我应该分享我的答案:

def reverse_rows(grid, columns):
    # split the grid into rows
    temp = [grid[i:i + int(columns)] for i in range(0, len(grid), int(columns))]
    temp.reverse()        # reverse the order of the rows
    reversed = []
    for grid in temp:     # reassemble the list
        reversed += grid
    return reversed       # and return the reversed list

请注意,此 returns 纹理列表,而不是 ImageGridTextureGrid,因此您可能会失去一些功能。

您可以使用这个 FlippedImageGrid class。归功于咖啡因丸

import pyglet


class TopLeftTextureGrid(pyglet.image.TextureGrid):

    def __init__(self, grid):
        image = grid.get_texture()
        if isinstance(image, TextureRegion):
            owner = image.owner
        else:
            owner = image

        super(TextureGrid, self).__init__(
            image.x, image.y, image.z, image.width, image.height, owner
        )

        items = []
        y = image.height - grid.item_height
        for row in range(grid.rows):
            x = 0
            for col in range(grid.columns):
                items.append(
                    self.get_region(x, y, grid.item_width, grid.item_height)
                )
                x += grid.item_width + grid.column_padding
            y -= grid.item_height + grid.row_padding

        self.items = items
        self.rows = grid.rows
        self.columns = grid.columns
        self.item_width = grid.item_width
        self.item_height = grid.item_height


class FlippedImageGrid(pyglet.image.ImageGrid):

    def _update_items(self):
        if not self._items:
            self._items = []
            y = self.image.height - self.item_height
            for row in range(self.rows):
                x = 0
                for col in range(self.columns):
                    self._items.append(
                        self.image.get_region(
                            x, y, self.item_width, self.item_height
                        )
                    )
                    x += self.item_width + self.column_padding
                y -= self.item_height + self.row_padding

    def get_texture_sequence(self):
        if not self._texture_grid:
            self._texture_grid = TopLeftTextureGrid(self)
        return self._texture_grid