Try like this:
As I have already mentioned, you need to add addLocalMonitorForEventsMatchingMask to your game scene method didMoveToView for the keyUp and keyDown events and add a switch statement to the keyCode event:
import SpriteKit class GameScene: SKScene { let sprite = SKSpriteNode(imageNamed:"Spaceship") var keyDownState:[String:Bool] = ["k":false, "j":false] var movingLeft = false var movingRight = false override func didMoveToView(view: SKView) { sprite.position = CGPoint(x: view.scene!.frame.midX, y: view.scene!.frame.midY) sprite.setScale(0.5) addChild(sprite) NSEvent.addLocalMonitorForEventsMatchingMask(.KeyDownMask) { (theEvent) -> NSEvent! in print("keyDown event") switch theEvent.keyCode { case 38: print("j is down") self.keyDownState["j"] = true case 40: print("k is down") self.keyDownState["k"] = true default: print("unknown key") } print(self.keyDownState.description) // j and k are pressed if self.keyDownState["j"]! && self.keyDownState["k"]! { self.sprite.removeAllActions() view.scene?.backgroundColor = NSColor.init(red: 1, green: 1, blue: 0, alpha: 1) } // j is pressed if self.keyDownState["j"]! && !self.keyDownState["k"]! { view.scene?.backgroundColor = NSColor.greenColor() if !self.movingLeft { self.sprite.removeActionForKey("moveSpriteRight") self.movingRight = false let moveSpriteLeft = SKAction.moveByX(-50, y: 0, duration: 0.1) self.sprite.runAction(SKAction.repeatActionForever(moveSpriteLeft) , withKey: "moveSpriteLeft") self.movingLeft = true } } // k is pressed if !self.keyDownState["j"]! && self.keyDownState["k"]! { view.scene?.backgroundColor = NSColor.redColor() if !self.movingRight { self.sprite.removeActionForKey("moveSpriteLeft") self.movingLeft = false let moveSpriteRight = SKAction.moveByX(50, y: 0, duration: 0.1) self.sprite.runAction(SKAction.repeatActionForever(moveSpriteRight) , withKey: "moveSpriteRight") self.movingRight = true } } return theEvent } NSEvent.addLocalMonitorForEventsMatchingMask(.KeyUpMask) { (theEvent) -> NSEvent! in print("keyUp event \(theEvent.keyCode)") switch theEvent.keyCode { case 38: print("j is up") self.keyDownState["j"] = false self.movingLeft = false case 40: print("k is up") self.keyDownState["k"] = false self.movingRight = false default: print("unknown key") } print(self.keyDownState.description) if self.keyDownState["j"]! && !self.keyDownState["k"]! { view.scene?.backgroundColor = NSColor.greenColor() self.sprite.removeActionForKey("moveSpriteRight") self.movingRight = false let moveSpriteLeft = SKAction.moveByX(-50, y: 0, duration: 0.1) self.sprite.runAction(SKAction.repeatActionForever(moveSpriteLeft) , withKey: "moveSpriteLeft") self.movingLeft = true } if !self.keyDownState["j"]! && self.keyDownState["k"]! { view.scene?.backgroundColor = NSColor.redColor() self.sprite.removeActionForKey("moveSpriteLeft") self.movingLeft = false let moveSpriteRight = SKAction.moveByX(50, y: 0, duration: 0.1) self.sprite.runAction(SKAction.repeatActionForever(moveSpriteRight) , withKey: "moveSpriteRight") self.movingRight = true } if !self.keyDownState["j"]! && !self.keyDownState["k"]! { self.sprite.removeAllActions() view.scene?.backgroundColor = NSColor(red: 0.72628, green: 0.726298 , blue: 0.726288, alpha: 1) } return theEvent } } override func mouseDown(theEvent: NSEvent) { /* Called when a mouse click occurs */ } override func update(currentTime: CFTimeInterval) { /* Called before each frame is rendered */ } }
Sample project