How to get the pressed keys in Swift

ε祈祈猫儿з 提交于 2019-12-10 03:31:52

问题


I am trying to learn the Swift language, and I followed a lot of tutorials on Youtube. Since most of them are for iOS, I wanted to make the OSX version of this one: https://www.youtube.com/watch?v=8PrVHrs10to (SideScroller game)

I followed it carefully but I am stuck at about 22 minutes of the video when I have to update the player position. My first problem was to get the pressed keys. I come from C# language, so I wanted to find something like

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

but this doesn't exist, so I figured out this:

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")
    }
}

I found the corresponding value(123/124/126) by using println(theEvent.keyCode) but it's not very useful if I have to recognize a lot of keys. Anyway, it works for this game, the position of the player changes. But I have another probem which is that the function keyDown doesn't seem to be called at each update (so 60 times per seconds) which prevent the player to move smoothly.

SO, here is my question: How can I have keyDown called at each update, and does anybody have a cleaner way to get the pressed Keys ?

Thank you


回答1:


Okay I found how to update, so I post it here 'cause it might help others. The idea is to use a boolean:

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()
    }
}

It may help others. But getting the pressed key's characters is still unclear...




回答2:


In combination with the above method I have created a method to change a key to a character:

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

This will return a character (from the key that was pressed). Then you can do something like this:

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")
    }
}

You could combine this method and the method from above to create something like a key listener.



来源:https://stackoverflow.com/questions/25058702/how-to-get-the-pressed-keys-in-swift

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!