Использование get_image Python Arcade для координат вне экрана - PullRequest
0 голосов
/ 06 мая 2019

Я пишу игру, в которой для рендеринга карты используется библиотека Arcade . Открыта главная аркада Window, которая используется для отладки, показывая часть игрового мира и позволяя пользователю прокручивать тайлы карты мира. Игроки не имеют доступа к этой программе, а взаимодействуют через удаленный текстовый интерфейс. Как часть этого, однако, они могут запросить «осмотреться» и получить PNG-скриншот, показывающий плитки, непосредственно окружающие их персонажа. Однако я обнаружил, что если какая-либо из координат пикселя (x, y) больше, чем соответствующая ширина / высота окна, возвращаемое изображение является полностью прозрачным PNG (ALPHA = 0).

def get_player_view(self, character: Actors.PlayerCharacter):
    # Character is a custom class that has the actor's xy position in grid-coordinates, which need to be converted to pixel xy coordinates

    # Need to find top left (x,y) of pixel in fov (square radius where player can see)
    # Find tile first
    top_left_tile: GameSpace.Space = character.location - (character.fov, character.fov)

    # Then convert game-coordinates to pixel (x, y, width, height)
    x = max(top_left_tile.x * self.base_cell_width, 0)
    y = max(top_left_tile.y * self.base_cell_height, 0)
    width = ((character.fov * 2) + 1) * self.base_cell_width
    height = ((character.fov * 2) + 1) * self.base_cell_height

    # Debugging
    LOG.info(f"Getting PlayerView: {character.name} {x} {y} {width} {height}")
    self._draw_callback = lambda: arcade.draw_rectangle_outline(x+width/2, y+height/2, width, height, arcade.color.BLACK)

    # Take and save image
    player_view = arcade.get_image(x, y, width, height)
    player_view.save(Path(f'./PlayerViews/{character.name}_screenshot.png'), 'PNG')

Функция скриншота работает нормально, если персонаж находится в области просмотра главного окна. Я также попытался нарисовать черный квадрат вокруг места, где должен быть сделан снимок экрана, чтобы убедиться, что я получил правильные координаты, что у меня есть.

Это наводит меня на мысль, что функция get_image не показывает ничего, что не было отображено в окне просмотра, что, я думаю, я понимаю. Однако возможность прокрутки с помощью метода set_viewport() заставляет меня поверить, что есть некоторая базовая графическая поверхность, которая буферизуется. Я попытался немного покопаться в коде, но я не знаю, OpenGL и pyglet не сильно отличается.

Как я могу захватывать части игрового экрана, которые находятся вне координат окна просмотра?

...