2017-06-06 58 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