How Can I get keyboard input in a SpriteKit Game?

后端 未结 4 1369
刺人心
刺人心 2020-12-11 16:59

I\'m a beginner in SpriteKit programming, and have been trying to figure out how to handle input from the keyboard.

What I\'ve found so far is that you should subcla

相关标签:
4条回答
  • 2020-12-11 17:42

    If you want to know whenever a key is pressed, you should subscribe to the global event manager.

    [NSEvent addGlobalMonitorForEventsMatchingMask:(NSKeyDownMask) handler:^(NSEvent *event) {
    [NSEvent removeMonitor:event];
    

    This will call the handler when ever a key is pressed.

    0 讨论(0)
  • 2020-12-11 17:59

    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)
                    }
                }
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-11 18:01

    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 :)

    0 讨论(0)
  • 2020-12-11 18:01

    Here is rougeExciter version of HeyFara's answer but in Swift 4.2... in case someone out there find this old post... as myself a few minutes ago :)...

    public override func keyDown(with event: NSEvent) {
        handleKeyEvent(event, keyDown: true)
    }
    
    public override func keyUp(with event: NSEvent) {
        handleKeyEvent(event, keyDown: false)
    }
    
    public func handleKeyEvent(_ event: NSEvent, keyDown: Bool){
        if event.modifierFlags.contains(NSEvent.ModifierFlags.numericPad) {
            if let theArrow = event.charactersIgnoringModifiers, let 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 {
                    switch(character){
                    case "w":
                        break
                    default:
                        print(character)
                    }
                }
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题