如何在Python中制作多击功能?

时间:2018-06-27 12:39:37

标签: python python-3.x pygame

我正在使用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

我想让这个程序注意到它们两者。

我该怎么做?

2 个答案:

答案 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