2

pygame.event.post()誰かが関数がどのように機能するかを助けて教えてもらえますか?私のコードは次のようになります。

class Game(object):
    def __init__(self):
        # importing pygame and creating display     
    def main(self):
        class fire_events(object):
            def __iter__(self):
                return self
            def next(self):
                return pygame.event.wait()
        # Main loop
            for event in fire_events():
                print "a"
                # DO SOME STUFF
    def post_my_event(self)
        #pygame.event.post doesnt work - it complains pygame.error: video system not initialized

つまり、基本的には、アプリケーションを作成し、メインループで実行してから、外部コードからイベントを投稿して、pygameに反応させたいだけです。

4

1 に答える 1

4

アプリケーションの外部Eventからpygamesイベントキューに魔法のように入れることはできません。

このようなことをしたい場合は、何らかのIPCまたはネットワークを使用する必要があります。

簡単な方法は、たとえばUDPを使用することです。

このクラスはUDPメッセージに応答し、イベントをpygameのイベントキューに入れます。

import socket
import pygame

pygame.init()

class UdpToPygame():

    def __init__(self):
        UDP_IP="127.0.0.1"
        UDP_PORT=15006
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        self.sock.setblocking(0)
        self.sock.bind((UDP_IP,UDP_PORT))

    def update(self):
        try:
            data, addr = self.sock.recvfrom(1024)
            ev = pygame.event.Event(pygame.USEREVENT, {'data': data, 'addr': addr})
            pygame.event.post(ev)
        except socket.error:
            pass    

アプリケーションでは、pygameそのクラスのインスタンスを作成updateし、メインループでメソッドを呼び出します。

カスタムイベントに応答するサンプルアプリケーションはUdpToPygame、キューに入れられます。

def main():
    dispatcher = UdpToPygame()
    screen = pygame.display.set_mode((800, 600))
    l = 0
    r = True
    while r:
        for ev in pygame.event.get():
            if ev.type == pygame.QUIT:
                r = False
            if ev.type == pygame.USEREVENT:
                t = pygame.font.SysFont('', 40).render(ev.data, True, (255,255,255))
                screen.blit(t, (0, l*20))
                l += 1
        dispatcher.update()        
        pygame.display.flip()

if __name__ == "__main__":
    main()

これを実行し、Pythonインタープリターを起動して、実行中のpygameアプリケーションにテキストを直接送信します。

>>> import socket
>>> sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
>>> while True:
...     sock.sendto(raw_input(), ("127.0.0.1", 15006))
...
hallo
5
pygame....
10

編集:

あなたのエラーについてpygame.error: video system not initialized

pygameをで初期化したことを確認してくださいpygame.init()

于 2012-07-06T12:43:27.160 に答える