2014-04-13 8 views
7

Ich bin ein Anfänger in der SpriteKit-Programmierung und habe versucht, herauszufinden, wie man Eingaben von der Tastatur verarbeitet.Wie kann ich in einem SpriteKit-Spiel Tastatureingabe erhalten?

Was ich bisher gefunden habe ist, dass Sie NSResponder Unterklasse sollte und es wie folgt umzusetzen:

@interface AppDelegate : NSResponder <NSApplicationDelegate> 
-(void)keyUp:(NSEvent *)theEvent; 
-(void)keyDown:(NSEvent *)theEvent; 
@end 

@implementation AppDelegate 
-(void)keyUp:(NSEvent *)theEvent 
{ 
    NSLog(@"Key Released"); 
} 
-(void)keyDown:(NSEvent *)theEvent 
{ 
    NSLog(@"Key Pressed"); 
} 
@end 

Offensichtlich gibt es noch ein paar Methoden/Eigenschaften in der Schnittstelle und Implementierung von AppDelegate aber ich didn Lege sie nicht dort hin, um die Frage relevant zu halten.

Als nächstes würde ich Schlüsselcodes verwenden, um zu erkennen, welche Tasten gedrückt werden, aber die Methoden keyUp und keyDown werden nicht einmal aufgerufen. Ich bin mir nicht sicher warum.

Hilfe?

Aktualisierung: Vielen Dank für Ihre Antworten! Ich habe festgestellt, dass Sie keyUp und keyDown direkt in Ihrer Szenen-Klasse implementieren müssen, da sie nicht von AppDelegate aufgerufen werden. Danke nochmal für die Hilfe!

Antwort

11

Der einfachste Weg, den ich kenne, ist die Implementierung der keyDown-Methode in Ihrer SKScene (und nicht direkt in der AppDelegate). Sie müssen nichts unterlassen.

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

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

Dann die Methode verwenden handleKeyEvent:(NSEvent *)event keyDown:(BOOL)downOrUp zu prüfen, welche Taste gedrückt wurde:

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

ich diesen Code aus dem Apple SpriteKit Adventure Spiel nahm. Ich fand es sehr nützlich SpriteKit zu lernen :)

0

Wenn Sie wissen möchten, wann eine Taste gedrückt wird, sollten Sie den globalen Ereignismanager abonnieren.

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

Dadurch wird der Handler aufgerufen, wenn eine Taste gedrückt wird.

5

Swift (2.0) Version von HeyFaras Antwort. Ich habe gerade "Pausen" gemacht, wo Sie Ihre eigentlichen Funktionsaufrufe machen würden.

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) 
       } 
      } 
     } 
    } 
} 
Verwandte Themen