Я пишу игру, в которой для рендеринга карты используется библиотека 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 не сильно отличается.
Как я могу захватывать части игрового экрана, которые находятся вне координат окна просмотра?