How Can I get keyboard input in a SpriteKit Game?

The easiest way I know is to implement the keyDown method in your SKScene (and not directly in the AppDelegate). You don't have to subclass anything.

- (void)keyDown:(NSEvent *)event {
    [self handleKeyEvent:event keyDown:YES];
}

- (void)keyUp:(NSEvent *)event {
    [self handleKeyEvent:event keyDown:NO];
}

Then use the method handleKeyEvent:(NSEvent *)event keyDown:(BOOL)downOrUp to check which key has been pressed :

- (void)handleKeyEvent:(NSEvent *)event keyDown:(BOOL)downOrUp {
    // First check the arrow keys since they are on the numeric keypad.
    if ([event modifierFlags] & NSNumericPadKeyMask) { // arrow keys have this mask
        NSString *theArrow = [event charactersIgnoringModifiers];
        unichar keyChar = 0;
        if ([theArrow length] == 1) {
            keyChar = [theArrow characterAtIndex:0];
            switch (keyChar) {
                case NSUpArrowFunctionKey:
                    self.defaultPlayer.moveForward = downOrUp;
                    break;
                case NSLeftArrowFunctionKey:
                    self.defaultPlayer.moveLeft = downOrUp;
                    break;
                case NSRightArrowFunctionKey:
                    self.defaultPlayer.moveRight = downOrUp;
                    break;
                case NSDownArrowFunctionKey:
                    self.defaultPlayer.moveBack = downOrUp;
                    break;
            }
        }
    }

    // Now check the rest of the keyboard
    NSString *characters = [event characters];
    for (int s = 0; s<[characters length]; s++) {
        unichar character = [characters characterAtIndex:s];
        switch (character) {
            case 'w':
                self.defaultPlayer.moveForward = downOrUp;
                break;
            case 'a':
                self.defaultPlayer.moveLeft = downOrUp;
                break;
            case 'd':
                self.defaultPlayer.moveRight = downOrUp;
                break;
            case 's':
                self.defaultPlayer.moveBack = downOrUp;
                break;
            case ' ':
                self.defaultPlayer.fireAction = downOrUp;
                break;
        }
    }
}

I took this code from the Apple SpriteKit Adventure game. I found it very usefull to learn SpriteKit :)


Swift (2.0) version of HeyFara's answer. I've just popped "breaks" in where you would make your actual function calls.

    public override func keyDown(theEvent: NSEvent) {
    handleKeyEvent(theEvent, keyDown: true)
}

public override func keyUp(theEvent: NSEvent) {
    handleKeyEvent(theEvent, keyDown: false)
}

public func handleKeyEvent(event:NSEvent, keyDown:Bool){
    if event.modifierFlags.contains(NSEventModifierFlags.NumericPadKeyMask){
        if let theArrow = event.charactersIgnoringModifiers, keyChar = theArrow.unicodeScalars.first?.value{
            switch Int(keyChar){
            case NSUpArrowFunctionKey:
                break
            case NSDownArrowFunctionKey:
                break
            case NSRightArrowFunctionKey:
                break
            case NSLeftArrowFunctionKey:
                break
            default:
                break
            }
        }
    } else {
        if let characters = event.characters{
            for character in characters.characters{
                switch(character){
                case "w":
                    break
                default:
                    print(character)
                }
            }
        }
    }
}