我正在使用Python 3.5。我想做多击功能。是的,我想创建一个同时注意到Ctrl + S and Q
的函数。但是程序没有。
这是我的代码:
import threading, pygame, sys
from pygame.locals import *
from time import sleep
pygame.init()
screen = pygame.display.set_mode((1160, 640), 0, 0)
screen.fill((255, 255, 255))
pygame.display.flip()
def background():
while True:
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if pygame.key.get_mods() & pygame.KMOD_CTRL and event.key == pygame.K_s:
print('GOOD')
def foreground():
while True:
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_q:
print('HELLO_WORLD')
if event.type == QUIT:
pygame.quit()
sys.exit()
b = threading.Thread(name='background', target=background)
b.start()
foreground()
程序注意到Q
,但没有Ctrl + S
。
我想让这个程序注意到它们两者。
我该怎么做?
答案 0 :(得分:-1)
pygame.event.get()
使用事件,因此您只需要一个地方处理事件,并在那个地方检查两个键:
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_q:
print('HELLO_WORLD')
if pygame.key.get_mods() & pygame.KMOD_CTRL and event.key == pygame.K_s:
print('GOOD')
if event.type == QUIT:
pygame.quit()
sys.exit()
不要在线程中使用两个循环,pygame无论如何都是事件驱动的,因此您可以只使用一个循环。
答案 1 :(得分:-1)
即使您可以从其他线程使用pygame功能,也应该从一个线程/一个位置处理所有pygame事件...如果您仍然坚持让多个线程读取键盘事件,则您会与诸如这个:
import threading
import pygame
import sys
from pygame.locals import *
from time import sleep
pygame.init()
screen = pygame.display.set_mode((1160, 640), 0, 0)
screen.fill((255, 255, 255))
pygame.display.flip()
keys = {
"mods": 0
}
def background():
while True:
mods = keys.get("mods", None)
if keys["mods"] & pygame.KMOD_CTRL and keys.get(pygame.K_s, False):
print("GOOD")
def foreground():
pygame.display.update()
while True:
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
keys[event.key] = True
mods = pygame.key.get_mods()
if mods:
keys["mods"] = mods
elif event.type == pygame.KEYUP:
keys[event.key] = False
keys["mods"] = 0
if event.type == QUIT:
pygame.quit()
sys.exit()
b = threading.Thread(name='background', target=background)
b.start()
foreground()
但是我建议您避免这种情况,通常您希望在一个线程中处理所有游戏输入,并希望使用其他线程来处理不同的游戏部分(物理,音频,逻辑等)。
也就是说,在创建实时应用程序时,我的经验法则是将它们设计为单线程应用程序,如果严格需要,则仅使用多线程...但是您知道吗?您会看到90%的案例(实时应用程序)足够好,因此... KISS