Python,Pygame,Pyro:如何通过网络发送表面?
-
13-09-2019 - |
题
我正在使用Pygame和Pyro在Python进行一个项目。我可以轻松地发送数据,功能,类等。但是,如果不在运输中垂死我,我就无法在电线上发送表面。
服务器在 def __init__
在整个电线上访问的班级:
self.screen = pygame.display.set_mode(SCREENRECT.size, NOFRAME)
在服务器上,丝网打印为 Surface(800x800x32 SW)
但是当客户检索时,它是 Surface(Dead Display)
.
不过要注意的东西。当我使用访问器功能获取屏幕时,我会得到一个死显示。如果我使用 print Player.screen
为了获得变量,我相反获得似乎是通往屏幕的pyro指针: <Pyro.core._RemoteMethod instance at 0x02B7B7B0>
. 。也许我可以退出这个?
我很可能很厚,有人有洞察力吗?谢谢。 :)
解决方案
Pygame表面是围绕基础SDL表面的包装器,我怀疑不能被Pyro序列化。如果您想在电线中复制其内容,最好做这样的事情:
- 在服务器上,使用Surface.get_buffer()获取对基础像素的访问。
- 记下表面的尺寸,颜色深度等。
- 将从电线1和2通过导线获得的数据发送到客户端。
- 在客户端上,从步骤2开始使用尺寸,颜色深度等创建一个新的表面。
- 使用Surface.get_buffer()设置新的Surface的像素,并从步骤1开始在像素中复制。
编辑:我只是想到我过度复杂化了。要序列您的表面,请使用 pygame.image.tostring(), ,为了重新加载,请使用 pygame.image.fromstring().
其他提示
一般而言,您不想在整个网络上发送表面(我假设表面是一个与设备有关的显示)。在大多数情况下,您的客户将负责在其本地表面上管理图纸,并且您的服务器负责告诉客户端需要绘制的内容。服务器甚至可能不会 有 能够显示图形的显示!
Try pickling the object and send the file...
不隶属于 StackOverflow