有效的键盘输入的处理
-
10-07-2019 - |
题
什么是一个很好的方式来实施键盘处理?在任何语言,这里我写的一个键盘互动的程序(例如俄罗斯方块游戏),我有一些代码,是这样的:
for event in pygame.event.get():
if event.type == KEYDOWN:
if False: pass #make everything an elif
elif rotating: pass
elif event.key == K_q:
elif event.key == K_e:
elif event.key == K_LEFT:
curpiece.shift(-1, 0)
shadowpiece = curpiece.clone(); setupshadow(shadowpiece)
elif event.key == K_RIGHT:
curpiece.shift(1, 0)
shadowpiece = curpiece.clone(); setupshadow(shadowpiece)
(缩短)。我不喜欢这样,因为这已经走在我的主循环,它会扰乱所有的程序部分。这也使得它不可能有用户配置屏幕在那里他们可以改变其关键的地图以其行动。是否有一个良好的模式来这样做使用某种形式的功能试镜?
解决方案
您可以创建一个字典,其中键是输入,值是处理按键的函数:
def handle_quit():
quit()
def handle_left():
curpiece.shift(-1, 0)
shadowpiece = curpiece.clone(); setupshadow(shadowpiece)
def handle_right():
curpiece.shift(1, 0)
shadowpiece = curpiece.clone(); setupshadow(shadowpiece)
def handle_pause():
if not paused:
paused = True
branch = {
K_q: handle_quit
K_e: handle_pause
K_LEFT: handle_left
K_RIGHT: handle_right
}
for event in pygame.event.get():
if event.type == KEYDOWN:
branch[event.key]()
然后更改密钥就是修改字典的键。
其他提示
除了 superjoe30的答案, 你可以使用两级制图(两个词典)
- key=>串的命令
- 命令string=>功能
我认为,这将使它更容易,以允许用户定义的映射。即因此,用户可以映他们的钥匙"命令"而不是"名称的功能"
我现在所做的是有一些输入收集类/函数/线程,它将检查预定义键列表 - <!> gt;事件绑定。
这样的事情:
class InputHandler:
def __init__ (self, eventDispatcher):
self.keys = {}
self.eventDispatcher = eventDispatcher
def add_key_binding (self, key, event):
self.keys.update((key, event,))
def gather_input (self):
for event in pygame.event.get():
if event.type == KEYDOWN:
event = self.keys.get(event.key, None)
if not event is None:
self.eventDispatcher.dispatch(event)
....
inputHandler = InputHandler(EventDispatcher)
inputHandler.add_key_binding(K_q, "quit_event")
...
inputHandler.gather_input()
....
这基本上就是superjoe30正在做的事情,除了不是直接调用回调,我通过使用事件调度系统添加另一个级别的分离,以便任何关心按下键的代码只是监听该事件。
此外,键可以轻松绑定到不同的事件,可以从配置文件或其他事件中读取,并且任何未绑定到事件的键都将被忽略。
不隶属于 StackOverflow