我正在写一个使用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并没有太大区别。
如何捕获窗口视口坐标之外的游戏屏幕部分?