pygame.event.get() Gagal Mengembalikan Acara dalam Thread Terpisah
Pertanyaan ini berkaitan dengan kesukaran yang dihadapi semasa menggunakan pygame.event .get() dalam urutan berasingan untuk mengurus input pengguna dalam permainan yang diilhamkan oleh Pac-Man. Coretan kod yang bertanggungjawab untuk menerima input adalah seperti berikut:
def receiving_inputs(self): while True: events = pg.event.get() for event in events: if event.type == pg.KEYDOWN: if event.key == pg.K_UP: self.move = 'n' elif event.key == pg.K_RIGHT: self.move = 'e' elif event.key == pg.K_DOWN: self.move = 's' elif event.key == pg.K_LEFT: self.move = 'w' time.sleep(1/60) threading.Thread(target=self.receiving_inputs).start()
Apabila kod ini dilaksanakan, menekan kekunci papan kekunci tidak mencetuskan sebarang peristiwa, manakala menggerakkan tetikus akan mengembalikan peristiwa. Menariknya, kod yang sama berfungsi dengan sempurna apabila dilaksanakan dalam gelung utama program dan bukannya utas yang berasingan.
Persoalannya berpunca daripada keinginan untuk meminimumkan kejadian penekanan kekunci tidak didaftarkan dalam gelung utama dengan menggunakan utas yang berasingan .
Penyelesaian:
The tingkah laku yang tidak dijangka berpunca daripada fakta bahawa peristiwa mesti diuruskan dalam urutan utama. Seperti yang dinyatakan dalam dokumentasi thepygame.event:
[...] Subsistem acara harus dipanggil dari urutan utama.
Walaupun boleh menyiarkan acara dari urutan yang berasingan, acara itu baris gilir hanya boleh diproses oleh utas utama. Oleh itu,
Pastikan acara diperolehi dalam urutan utama:
def receiving_inputs(self): while True: events = pg.event.get() for event in events: ...
Buat urutan untuk mengubah suai keadaan permainan berdasarkan acara:
def move(self, move): ... thread = threading.Thread(target=self.move, args=(move,)) thread.start()
Atas ialah kandungan terperinci Mengapakah `pygame.event.get()` Gagal Mengembalikan Acara dalam Benang Berasingan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!