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