2

我正在使用 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>. 也许我可以取消引用这个?

我很可能很厚,有没有人有一些见识?谢谢。:)

4

3 回答 3

6

pygame Surface 是底层 SDL 表面的包装器,我怀疑它不能被 Pyro 序列化。如果你想通过网络复制它的内容,你最好做这样的事情:

  1. 在服务器上使用 Surface.get_buffer() 来访问底层像素。
  2. 记下 Surface 的尺寸、颜色深度等。
  3. 将步骤 1 和 2 中获得的数据通过网络发送到客户端。
  4. 在客户端上使用步骤 2 中的尺寸、颜色深度等创建一个新表面。
  5. 使用 Surface.get_buffer() 设置新 Surface 的像素并复制步骤 1 中的像素。

编辑: 我突然想到我把它复杂化了。要序列化 ​​Surface,请使用pygame.image.tostring(),要重新加载它,请使用pygame.image.fromstring()

于 2009-11-03T06:44:58.637 回答
1

一般来说,您不想通过网络发送 Surface(我假设 Surface 是依赖于设备的显示器)。大多数时候,您的客户端将负责管理其本地 Surface 上的绘图,而您的服务器负责告诉客户端它需要绘制什么。服务器甚至可能没有能够显示图形的显示器!

于 2009-11-03T05:25:33.787 回答
0

尝试腌制对象并发送文件...

于 2009-11-03T08:21:18.970 回答