2016-03-03 69 views
0

我有一個問題:在OSX上使用Sprite Kit處理玩家輸入(移動角色)的最佳做法是什麼?OS X上的Sprite Kit - 移動

是在keyDown:方法中使用switch-case語句的最佳方法,還是比200行開關有更好的方法嗎?

我問,因爲我處理玩家輸入有點麻煩。

祝您有愉快的一天。

回答

1

當蘋果公司將其臭名昭着的冒險遊戲在線作爲如何使用SpriteKit的例子時,他們確實使用了keyDownkeyUp方法。他們甚至將它們組合成一種方法來處理這兩種情況。在SKScene:

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

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

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

這是從他們的冒險遊戲代碼,直到他們把它取下來,從他們的服務器(其中,可悲的是,意味着你不能再訪問)。我一直認爲這是做這件事的最好方式,因爲Doc's推薦它,但我可能是錯的。另外,我從來沒有真正需要處理> 200個不同的按鍵輸入,就像你在問題中說的那樣。但是,對於使用典型的wasd,空格鍵和其他鍵的遊戲,這對我來說工作得非常好。

+0

Thans。我希望玩家設置自己的移動設置,並允許單個設備上最多4名玩家不用網絡遊戲。因此我需要處理所有可以使用的鍵。我使用基於NSArray的解決方案,該解決方案對每個鍵都有索引,幷包含對執行的對象和選擇器的引用。但是出現了一些神祕的問題(如果所有角色都在移動,其中一個角色滯後直到enyone按下鍵),所以我想知道是否列舉NSArray是最佳做法。我還想知道,即使在Apple TV等RICS CPU上,開關盒的時間複雜度也是O(1)。 (順便說一句,你有演示項目?ty) –