我正在为swift中的Mac OSX创建基于2D平铺的平台游戏。当一次按下多个键时,我遇到了控件的问题。例如;如果' D'让角色向右移动,并且' W'让他跳;如果我持有' D'让角色跑,然后点击“W'为了让他跳起来,一旦他降落就会停下来。他继续向右移动的唯一方法是修饰' D' D'再次,这当然是不可取的。看起来好像什么时候W' W'按下键,它取消了' D' keyDown事件。如果有人有任何关于如何制作它的建议,以便可以按下多个键而不取消其他类似的事件,我肯定会很感激。 这就是我的KeyDown事件的样子:
func returnChar(theEvent: NSEvent!) -> Character?{
let s: String = theEvent.characters!
for char in s {
return char}
return nil
}
override func keyDown(theEvent: NSEvent) {
let s: String = String(self.returnChar(theEvent)!)
switch(s){
case "w":
player.jump()
case "s":
// nothing yet
case "d":
player.moveLeftOrRight(CGVector(dx: 1.0, dy: 0.0))
case "a":
player.moveLeftOrRight(CGVector(dx: -1.0, dy: 0.0))
default:
println("default")
}
}
答案 0 :(得分:3)
键按下时发生的重复keydown事件由键盘硬件生成。在PC上,协议定义说:
如果按某个键,其生成代码将发送到计算机。当您按住某个键时,该键将成为键控键,这意味着键盘将继续发送该键的make代码,直到释放键或按下其他键为止。要验证这一点,请打开文本编辑器并按住“A”键。 ...键盘内没有缓冲类型数据。在按下多个键的情况下,仅按下的最后一个键变为键控。然后,当释放该键时,Typematic repeat会停止,即使其他键可能被按下。
由于PC和Mac都可以使用相同的USB键盘(以某些键重映射为模),我很确定它们都使用相同的协议。
如果您描述,则会出现问题,因为即使您按住D
,当您点击W
时,键盘也会停止重复D
键。事件的顺序是:
Keydown D
Keydown D
...
Keydown W
Keyup W
此时键盘事件停止。请注意,Keyup D
尚未发生,因此您实际上知道D
键仍然处于关闭状态,但现在由您来模拟重复的按键。
我建议你研究如何在键盘硬件中完全禁用自动重复(或者只是忽略键重复事件)并自己生成所需的游戏行为。您可以通过使用Keydown
和Keyup
事件跟踪每个密钥的状态来轻松完成此操作,而忽略重复的Keydown
。
答案 1 :(得分:0)
如果使用SpritKit,您可以在使用keyDown和keyUp方法中设置的bool时在update方法中进行角色移动。