【问题标题】:How to get the pressed keys in Swift如何在 Swift 中获取按下的键
【发布时间】:2014-09-23 09:16:28
【问题描述】:

我正在努力学习 Swift 语言,我在 Youtube 上学习了很多教程。因为大部分都是iOS版,所以我想做这个的OSX版本:https://www.youtube.com/watch?v=8PrVHrs10to(SideScroller游戏)

我仔细观察了它,但是当我必须更新播放器位置时,我被困在大约 22 分钟的视频中。我的第一个问题是得到按下的键。我来自 C# 语言,所以我想找到类似的东西

If(Keyboard.GetState().IsKeyDown(Keys.Right))
    man.Position.x += 5 //player position

但这不存在,所以我想出了这个:

override func keyDown(theEvent: NSEvent!)
{
    updateManPosition(theEvent)
}
func updateManPosition(theEvent:NSEvent)
{
    if theEvent.keyCode == 123
    {
        man.position.x -= 2
    }
    else if theEvent.keyCode == 124
    {
        man.position.x += 2
    }
    else if theEvent.keyCode == 126
    {
        println("jump")
    }
}

我使用println(theEvent.keyCode) 找到了相应的值(123/124/126),但如果我必须识别很多键,它就不是很有用。 无论如何,它适用于这个游戏,玩家的位置会改变。但我还有另一个问题,即函数keyDown 似乎在每次更新时都没有被调用(所以每秒60 次),这会阻止玩家顺利移动。

所以,这是我的问题:如何在每次更新时调用 keyDown,有没有人有更简洁的方法来获取按下的键?

谢谢

【问题讨论】:

    标签: macos keyboard swift sprite-kit keyboard-events


    【解决方案1】:

    好的,我找到了如何更新,所以我把它贴在这里,因为它可能会帮助其他人。这个想法是使用布尔值:

    var manIsMoving:Bool = false
    
    override func keyDown(theEvent: NSEvent!) // A key is pressed
    {
        if theEvent.keyCode == 123
        {
            direction = "left" //get the pressed key
        }
        else if theEvent.keyCode == 124
        {
            direction = "right" //get the pressed key
        }
        else if theEvent.keyCode == 126
        {
            println("jump")
        }
        manIsMoving = true //setting the boolean to true
    }
    
    override func keyUp(theEvent: NSEvent!)
    {
        manIsMoving = false 
    }
    
    override func update(currentTime: CFTimeInterval)
    {
        if manIsMoving
        {
            updateManPosition(direction)
        }
        else
        {
            cancelMovement()
        }
    }
    

    它可能会帮助其他人。 但是获取按键的字符仍然不清楚......

    【讨论】:

      【解决方案2】:

      结合上面的方法,我创建了一个将键更改为字符的方法:

      private func returnChar(theEvent: NSEvent) -> Character?{
          let s: String = theEvent.characters!
          for char in s{
              return char
          }
          return nil
      }
      

      这将返回一个字符(从按下的键)。 然后你可以这样做:

      override func keyUp(theEvent: NSEvent) {
          let s: String = String(self.returnChar(theEvent)!)
          switch(s){
          case "w":
              println("w")
              break
          case "s":
              println("s")
              break
          case "d":
              println("d")
              break
          case "a":
              println("a")
              break
      
      
          default:
              println("default")
          }
      }
      

      你可以把这个方法和上面的方法结合起来创建一个类似键监听器的东西。

      【讨论】:

      • 比较字符对于游戏来说是个坏主意,因为键盘区域设置不同,像“/”这样的键在某些但不是所有区域设置上可能需要 shift 或其他修饰符
      猜你喜欢
      • 2012-12-02
      • 1970-01-01
      • 2015-11-04
      • 1970-01-01
      • 2012-09-23
      • 2020-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多