2017-06-06 11 views
1

私は自分のゲームとオンラインにpygameを使用していますが、ゲームのメインループがサーバからソケットを待つときはいつでも問題ありません。 あなたのターンをやっていない限り、クライアントはサーバからソケットを待っています。ソケットを手に入れてターンを待つ間は、何もしません。待機中のpygameフリーズのウィンドウ

私は、このサイトや他のサイトや、5秒後にOSがウィンドウ(自分自身をロックしている)を考えてから理解したことから、いくつかの答えと解決策を読んでいますか?だから私はスレッドkeep_runを作成しましたが、それは変更されず、ウィンドウはまだ凍っていません。

また、keep_run()が私が使用した唯一のスレッドなので、助けがあればサーバはselectライブラリで動作します。

私のコードには多くの行が含まれていませんでしたが、多すぎるかもしれませんが、おそらくそれを引き起こす重要な要素の基本的な結論がありますか?例の

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のは、SDLの上に構築され、定期的にin the thread that initialized the video subsystem(暗黙のうちにpygame.event.get()pygame.event.clear()pygame.event.poll()pygame.event.wait()またはpygame.event.peek()によって呼び出される)pygame.event.pump()を呼び出す必要がありますSDLドキュメント)。

pygame.event.pump()を使用せず、代わりにpygame.event.get()またはpygame.event.poll()ですべてのイベントを正しく処理することをお勧めします。これについての詳細here

関連する問題