2016-03-03 74 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) –