我需要为Pygame项目做一些基本的网络编程。
基本上,这是一个2D单人或合作游戏。网络编程只需要支持两个玩家,其中一个是主机。
唯一需要发送的信息是玩家、小兵和子弹的位置。
我查阅了一些资料,Twisted 似乎是一个不错的选择,但我从未做过网络编程,也不确定是否太复杂。
因此,相对新手能否在 Pygame 中实现网络编程?
我需要为Pygame项目做一些基本的网络编程。
基本上,这是一个2D单人或合作游戏。网络编程只需要支持两个玩家,其中一个是主机。
唯一需要发送的信息是玩家、小兵和子弹的位置。
我查阅了一些资料,Twisted 似乎是一个不错的选择,但我从未做过网络编程,也不确定是否太复杂。
因此,相对新手能否在 Pygame 中实现网络编程?
这个问题最近在 Reddit 上被问到了,所以我更多地是从那里复制我的答案。很抱歉我不能提供更多的链接,因为我只有不到10的声望,所以一次只能发布两个链接。
Twisted 可能可行,但我没有太多的经验。我建议使用 sockets,因为这就是 Twisted 在后台使用的。Beej 的指南(谷歌一下)几乎是 sockets 的圣经,如果你想学习它们的工作原理(用 C++ 编写,但概念适用于任何语言)。Python 确实抽象了一些复杂性,但了解后台发生的事情仍然是一个好主意。
对于 Python 特定的 sockets,你可以直接使用 howto(user745294 上面发布了一个链接)。这里有一篇标题为“每个程序员需要了解的游戏网络”的好文章。它讨论了不同类型的主要网络风格(客户端-服务器、点对点、UDP v. TCP 等)以及一些主要游戏在其网络方面使用的历史背景。
下面是我在Python 2.6/Pygame中制作网络“游戏”时做的演示链接。它实际上不是一款游戏,但你创建的每个客户端都连接到服务器并控制一个角色。你可以使用箭头键移动你的角色,角色将在所有连接的客户端上移动。我试图用一些注释来说明我正在发送和接收的内容,但你可能需要一些关于套接字的知识才能理解它。您可以使用Twisted来进行Pygame的网络编程。在Launchpad上的“game”项目中,有一些示例可以展示如何将主循环集成起来;基本上,您可以使用twisted.internet.task.LoopingCall
来绘制Pygame帧并处理输入,同时让您选择的Twisted反应器正常运行。
既然您已经在使用Pygame,我认为这个专为Pygame开发的轻型网络库可以满足您的需求并帮助您学习,而不会让您感到不知所措。
在Python中,还有Pyro(Python远程对象)作为另一种网络解决方案。
使用原始套接字是低级且充满危险的。如前所述,Twisted 是复杂的,并需要时间来启动和运行。为了避免一些头疼的问题,我建议尝试使用像 zerorpc 这样的东西。
你需要以下解决方案:
以上应该仍然被称为“基础”,你应该真正使用一些带有惯用 API 的花哨的网络库。
实质上,你需要公开网络服务(在其自己的线程中),该服务将推送消息到 Python 的 Queue
,然后从你的 Pygame 代码访问此相同的队列,如果有消息,则更新你用于存储玩家位置并在屏幕上绘制它的任何结构。
你不应该像发送子弹位置这样的东西通过网络发送,因为它们可以在本地轻松(且更快地)计算。你只需通过网络发送一个事件,例如 bullet_shot
,带有源位置和速度向量。
ConnectionResetError: [WinError 10054] 远程主机强制关闭了一个现有的连接
。我在这里做错了什么吗? - Patlatus