【问题标题】:Basic networking with PygamePygame 的基本网络
【发布时间】:2012-04-15 05:55:43
【问题描述】:

我需要为 Pygame 项目做一些基本的网络工作。

基本上,这是一款 2D 单人游戏或合作游戏。组网只需要支持2名玩家,其中1人作为主机。

唯一需要发送的信息是玩家、小兵和子弹的位置。

我一直在阅读,Twisted 不断出现,但我之前没有做过网络,我不确定这是否是矫枉过正。

那么,相对新手是否可以在 Pygame 中实现网络?谁能指出我正确的方向?

【问题讨论】:

    标签: python networking twisted pygame


    【解决方案1】:

    这是最近在 Reddit 上被问到的,所以我或多或少只是从那里复制我的答案。对于无法提供更多链接,我深表歉意,我有

    Twisted 可能会起作用,但我对此并没有太多经验。我建议使用套接字,因为无论如何这就是 Twisted 在后台使用的。如果您想了解它们是如何工作的(在 C++ 中,但概念无处不在),Beej 的指南(谷歌它)几乎是套接字的圣经。 Python 确实抽象了一些复杂性,但了解后台发生的事情仍然是一个好主意。

    对于 Python 特定的套接字,您可以继续使用操作指南(user745294 在上面发布了链接)。 Here 是一篇不错的文章,标题为“每个程序员需要了解的关于游戏网络的知识”。它涉及不同类型的主要网络风格(客户端-服务器、p2p、udp v. tcp 等)以及一些主要游戏用于网络的历史。

    下面是我在 Python 2.6/Pygame 中制作联网“游戏”的演示的链接。它实际上不是游戏,但您创建的每个客户端都连接到服务器并控制一个角色。您可以使用箭头键移动您的角色,该角色将在所有连接的客户端上移动。我尝试在源代码中添加一些我要来回发送的内容的注释,但您可能需要一些关于套接字的知识才能理解它。

    源代码在本文下方评论中的键盘链接中提供。您需要在与脚本相同的目录中提供两个图像:

    1. bg.png 是背景精灵。它应该是一个 400 像素宽和 300 像素高的图像(如果需要,可以在 GameClient 类中更改)
    2. sprite.png 是玩家角色。它应该比背景小,以便您可以看到它四处移动。

    【讨论】:

    • 这里有几个指向客户端/服务器的键盘链接,以防您不想访问 mediafire(您必须提供自己的 bg.png 和 sprite.png)。服务器:codepad.org/p9lVrmqn 客户端:codepad.org/e6pwGj24
    • Mediafire 链接似乎已经失效了。不过,键盘链接很棒,谢谢!
    • 嗨,我知道这是旧的,但 mediafire 链接已失效。如果你还碰巧有源代码我真的很感兴趣!
    • 源代码在上面评论的键盘链接中提供。 mediafire 中包含的唯一附加内容是两个图像:bg.png(背景)和 sprite.png(玩家角色)。提供您自己的两张图片(我不再拥有它们),代码将按预期工作。
    【解决方案2】:

    您可以使用Twisted 与 PyGame 联网。 Launchpad 上的The "game" project 提供了一些如何将主循环集成在一起的示例;基本上,使用twisted.internet.task.LoopingCall 来绘制 PyGame 帧并处理输入,同时让您选择的 Twisted reactor 正常运行。

    【讨论】:

      【解决方案3】:

      由于您已经在使用 Pygame,我认为这个为 Pygame 制作的轻量级网络库将满足您的需要并教给您,但不会让您不知所措。 "Mastermind Networking Lib" via pygame.org

      【讨论】:

      • Mastermind 使用不安全的pickle" 警告:pickle 模块对错误或恶意构造的数据不安全。切勿取消从不受信任或未经身份验证的来源接收的数据。"
      • 作者更改了lib,现在默认使用json,这是安全的。
      【解决方案4】:

      还有 pyro(python 远程对象)作为 python 中网络的另一种解决方案。

      http://irmen.home.xs4all.nl/pyro/

      【讨论】:

      • 不要将 Pyro 用于任何不受信任的通信。它绝对不适合在互联网上玩的游戏。 packages.python.org/Pyro4/…
      • 我承认这不是最好的用例,谢谢指出。
      【解决方案5】:

      使用原始套接字是低级的并且充满危险。如前所述,Twisted 很复杂,需要时间来启动和运行。为了省去一些麻烦,我会尝试https://github.com/dotcloud/zerorpc-python

      您需要以下解决方案:

      • 发现(本地)网络上的其他播放器,您不希望播放器输入某个 IP 地址
      • 处理网络错误
      • 序列化包含您的数据(位置、球员姓名等)的消息
      • 在网络是异步 IO 时处理线程

      以上内容仍应称为“基本”,您应该真正使用一些带有惯用 API 的精美网络库。

      更新:

      基本上你需要公开网络服务(在它自己的线程中),它将消息推送到 Python 的Queue,然后从你的 Pygame 代码访问同一个队列,如果有消息,那么你更新你使用的任何结构存储玩家的位置并将其绘制在屏幕上。您不应该通过网络发送子弹位置之类的东西,因为它们可以在本地轻松(并且更快)计算,您只需通过网络发送带有源位置和速度矢量的 bullet_shot 之类的事件。

      【讨论】:

      • Twisted 并不是那么复杂。一个回显服务器是 3 行代码。 2 路 RPC 服务器仅此而已。不过,Twisted 是一个通用的网络解决方案,适用于游戏客户端 - zerorpc 依赖于 zeromq,因此不适合不受信任的客户端通信;更多的是为了协调后端服务。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-21
      • 2017-11-08
      • 1970-01-01
      • 2018-05-03
      • 1970-01-01
      相关资源
      最近更新 更多