我对python和编程比较陌生,想知道如何在pygame制作的单人游戏中添加多人游戏功能。我已经制作了一个可以接受多个连接的功能性服务器和一个用于发送消息的系统的客户端。我试图制作一个客户端,运行一个游戏,并发送各种游戏数据(如x位置)到服务器,同时也从其他客户端接收这些数据,但没有成功。 这是我的邮件客户端代码:
import socket
import threading
class Client:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
def sendMSG(self):
while True:
self.sock.send(bytes(input(''), 'utf-8'))
def __init__(self):
port = 12345
self.sock.connect(('127.0.0.1', port))
iThread = threading.Thread(target=self.sendMSG)
iThread.daemon = True
iThread.start()
while True:
data = self.sock.recv(1024)
if not data:
break
print(str(data, 'utf-8'))
client = Client()
它很好地发挥了它的作用,但是我不能把它和我的单人游戏代码结合起来。我尝试改变sendMSG函数的功能,并将其视为游戏循环。我能够到达这样一个点:当按下方向键时,客户机发送位置数据,值发生更改,但是在尝试接收这些数据时遇到了麻烦。我使用线程,但由于某些原因,它不运行游戏和接收数据在同一时间。也许我的思维过程是错误的?如果你能帮我弄清楚如何将我的游戏循环添加到客户端,我将不胜感激。谢谢。在
您的客户端代码有一些问题,这使得很难将其集成到一个框架中,据我所知,它有自己的事件循环(即pygame,我从未使用过):
阻止
^{pr2}$input
,从而阻止游戏事件循环。您试图通过将它放入自己的线程来避免这种情况,但是现在您已经将键盘完全移到了另一个线程上。另一件事是也会阻塞。现在您刚刚从
input
上释放的线程被socket.recv
阻塞。在你使用UDP的想法确实很有前途。现在,您可以使用两个(几乎)非阻塞方法}来构建一个游戏客户端类:
send_message()
和{因为我不知道pygame,我破解了我自己的原始游戏事件循环,它处理我的位置(
my_x, my_y
)和其他玩家的位置(positions
),并偶尔将我的玩家随机移动一次,以`{“playername”:[xpos,ypos]}'的形式发送和接收玩家的位置作为消息:服务器本身只是将它接收到的每个消息回送给它所听过的所有其他客户机:
您必须以某种方式将
game()
函数的思想融入到pygame事件循环中。祝你好运。在相关问题 更多 >
编程相关推荐