2017-06-06 60 views
1

我使用pygame的为我的比赛,它的在线,但问题是,每当游戏的主循环从服务器等待插座的冻结。 所以,除非你正在做你的回合中,客户端等待来自服务器的插座,什么也不做,等待和冻结,直到它得到了插座,做它的转向。窗口pygame的冻结,同时等待

所以我在这个网站和其他一些和读取几个答案和解决方案,我什么都不做的OS认为窗口(锁定本身)5秒后,明白了吗?所以我创建了线程keep_run,但它没有做任何改变,窗口仍然冻结,而没有轮到他。

另外提一下的服务器选择库工作,如果其因为反正帮助keep_run()是我使用的唯一线索。

我并没有包括多条线路在我的代码,因为有太多,但其重要的东西一个基本结论,也许造成的吗?实例的

import sockets 
import pygame 
from threading import Thread 
def keep_run(): 
    clock = pygame.time.Clock() 
    fps = 60 
    while True: 
     pygame.event.pump() 
     clock.tick(fps) 

pygame.init() 
keep_running = Thread(target=keep_run) 
keep_running.setDaemon(True) 
keep_running.start() 


while Game_run: 

    #the main loop 
    server_command = client_socket.recv(1024) 
    if server_command == "move": 
     # make your turn 
     do_turn() 
    elif server_command == "over": 
     # finish the game 
     finish_game() 

图像:https://i.stack.imgur.com/b4Qx8.png

+0

Game_run或许应该被称为 “game_run”。只要有内部一致性,应该不重要。 – Frogboxe

回答

0

必须调用pygame.event.pump()(这是隐含pygame.event.get()叫,pygame.event.clear()pygame.event.poll()pygame.event.wait()pygame.event.peek())定期in the thread that initialized the video subsystem(pygame的是建立在SDL,因此链接SDL文档)。

我也建议您不要使用pygame.event.pump(),而是与pygame.event.get()pygame.event.poll()妥善处理事件。更多关于此here