Input Pyglet在上一帧未按下键时检测

Input Pyglet在上一帧未按下键时检测,input,python-3.6,keyboard-events,pyglet,Input,Python 3.6,Keyboard Events,Pyglet,我目前正在用pyglet制作一个游戏,我的按键输入设置如下: def on_key_release(self, symbol, modifiers): try: del self.keys[symbol] except: pass def on_key_press(self, symbol, modifiers): if symbol == key.ESCAPE: # [ESC] self.alive = 0 s

我目前正在用pyglet制作一个游戏,我的按键输入设置如下:

def on_key_release(self, symbol, modifiers):
    try:
        del self.keys[symbol]
    except:
        pass

def on_key_press(self, symbol, modifiers):
    if symbol == key.ESCAPE:  # [ESC]
        self.alive = 0
    self.keys[symbol] = True
我需要能够检测到玩家何时第一次按下键而不是按住键。例如,我尝试过以下方法:

def update(self, keys, dt):
    if (key.UP in keys) & (key.UP not in self.prev_keys):
        jump()
self.prev_keys = keys
但无论发生什么,他们总是平等的。我看不出他们是什么时候第一次按下钥匙的。如果您需要有关我正在尝试做什么或我的代码当前如何设置的更多信息,请询问。谢谢你的帮助

编辑:好吧,我知道我的问题出在哪里了。除了下面Torxed关于&vs.使用的回答之外,我的主要问题是dictionary对象是链接的。因此,我需要使用self.prev_keys=keys.copy来代替self.prev_keys=keys。希望这能帮助任何和我有同样问题的人

因此,您的主要问题可能是在此处使用&而不是和:

因为不一样。如果一个或多个1彼此对齐,&实际上会在位级别上进行比较。下面是一个简单的示例,说明了如何使用它们以及如何使用它们:

00000001  # Value 1
00000011  # Value 3
执行1和3将导致1,因为在位级别上,1位于同一位置。其中,如以下示例所示:

00000001  # Value 1
00000100  # Value 4
执行1和4将导致0,因为1向下对齐向上

你试图比较两个if语句是否都是真的如果。。。和通过使用位级比较器。这是行不通的。因此,这里的解决方案是:

if (key.UP in keys) and (key.UP not in self.prev_keys):
因此,代码可能类似于:

从pyglet进口* 从pyglet.gl导入* key=pyglet.window.key 类mainpyglet.window.window: 定义初始自我,宽度=800,高度=600,fps=False,*args,**kwargs: 超人,自我。初始宽度,高度,*args,**kwargs self.x,self.y=0,0 self.keys={} 自处理的_键={} self.mouse_x=0 self.mouse_y=0 self.alive=1 def on_draw self: 自我渲染 关闭自身上的def: self.alive=0 鼠标上的def运动自身,x,y,dx,dy: self.mouse_x=x def on_键_释放自我、符号、修改器: 尝试: del self.keys[符号] 除: 通过 def on_键按自身、符号、修改器: 如果符号==key.ESCAPE:[ESC] self.alive=0 self.keys[符号]=真 def renderself: 自清 在此处添加要渲染的内容。 最好以批次的形式。 自我翻转 def jumpself: 打印“跳起来了,耶!” def更新自我: 如果key.UP在self.keys中,key.UP不在self.processed_key中: 自我跳跃 self.processed_keys={**self.keys} def runself: 当self.alive==1时: 自我更新 自我渲染
------>这是关键的乐趣,看看是在使用。解决这一问题的方法是将跳转逻辑放在按键上,这是最快的解决方案。第二个更好的方法是更详细一点,在这里你实现了你想要实现的东西,一个二级映射,在这个映射上,键已经被自处理了。例如,u键。self.prev_键缩进是错误的还是实际上超出了更新功能?@Torxed非常感谢您的回复!早些时候,我试图找出基于对象的仔猪,我发现你们的反应。这是非常有用的,所以非常感谢您的回复和其他回复。在我学习小猪的过程中,你们真的帮了我很大的忙,所以谢谢你们!该死的,我想我解决了你的主要问题,同时又把解决方案复杂化了,哈哈。哦,天哪,在过去的几个月里,PHP/Javascript有了很大的发展。下面的解决方案。谢谢,这肯定是一个我需要修复的错误,但实际上对我的问题没有帮助,尽管我需要在某个时候修复这个问题,因为当我尝试通过打印调试时,当它是一个新循环的开始,然后是键和以前键的两个字典时,它们总是完全相同的。我想我会采用一种方法,在这种方法中,我有一个处理过的键dict,而不是以前的键。然后,当我第一次真正处理它时,我可以从中取出一把钥匙。谢谢你的帮助!
if (key.UP in keys) and (key.UP not in self.prev_keys):