2015-05-23 46 views
1

我有一个游戏使用全局整数position来浏览选项菜单。当每个屏幕都按下后退按钮时,它会调用功能[self options]重新加载原始“选项”屏幕。我有一种感觉,这是非常愚蠢的东西我搞砸了。Objective-C switch语句的奇怪行为

现在,调用确定背部按钮是否是这个函数的代码:

if ([self touchIsInNode:[self childNodeWithName:@"back"] touchPoint:touchPoint]) { 
        // stuff should happen here 
       } 

随着touchIsInNode:是处理水龙头返回BOOL值自己的自定义方法(YES如果是) 。

命名为每个屏幕backabackbbackc等的后退按钮的按钮是一个可行的解决办法,但它仍然呼叫在每个开关情况下,代码不管position值。

下面是我在switch发言中事:

switch (position) { 
      // case 0 thru 3 are unrelated to the question... 0 is for the main menu, 1 is for the original logic for the "options" screen, 2 is for the end of the game, and 3 is to skip to the end of the intro screen. 
      case 4: 
      { 
       NSLog(@"position: %i", position); 
       if ([self touchIsInNode:[self childNodeWithName:@"backa"] touchPoint:touchPoint]) { 
        NSLog(@"store back button was pressed and [self options] is being called..."); 
        [self options]; 
       } 
       // store UI 
      } 
      case 5: 
      { 
       NSLog(@"position: %i", position); 
       if ([self touchIsInNode:[self childNodeWithName:@"backb"] touchPoint:touchPoint]) { 
        NSLog(@"stats back button was pressed and [self options] is being called..."); 
        [self options]; 
       } 
       // stats UI 
      } 
      case 6: 
      { 
       NSLog(@"position: %i", position); 
       if ([self touchIsInNode:[self childNodeWithName:@"backc"] touchPoint:touchPoint]) { 
        NSLog(@"about back button was pressed and [self options] is being called..."); 
        [self options]; 
       } 
       // about UI 
      } 
      case 7: 
      { 
       NSLog(@"position: %i", position); 
       if ([self touchIsInNode:[self childNodeWithName:@"backe"] touchPoint:touchPoint]) { 
        NSLog(@"dev options back button was pressed and [self options] is being called..."); 
        [self options]; 
       } 
       // dev options UI 
      } 
      case 8: 
      { 
       NSLog(@"position: %i", position); 
       if ([self touchIsInNode:[self childNodeWithName:@"backd"] touchPoint:touchPoint]) { 
        NSLog(@"purchased options back button was pressed and [self options] is being pressed..."); 
        [self options]; 
       } 
       // purchased options UI 
      } 
      default: 
      { 
       NSLog(@"INVALID POSITION: %i", position); 
       break; 
      } 
     } 
} 

options方法是这样的:

for (SKNode* node in [self children]) { 
    // fade out and remove each node if it is not "optionsButton" 
    if (![node.name isEqual:@"optionsButton"]) { 
     [node runAction:[SKAction fadeAlphaTo:0 duration:1] completion:^{ 
      [node removeFromParent]; 
     }]; 
    } else { 
     // if it is "optionsButton", perform an animation. 
     [node runAction:[SKAction scaleTo:1.5 duration:1]]; 
     [node runAction:[SKAction moveTo:CGPointMake(self.size.width/2, self.size.height - ((node.frame.size.height * (4.0/3.0))/node.yScale)) duration:1] completion:^{ 
      // afterwards, call a method that logs each node's name. 
      [self logEveryNode]; 
     }]; 
    } 
} 
position = 1; 
NSLog(@"position: %i", position); 

// processing labels 

// add in each child 

NSLog(@"options called, with %i nodes in [self children]", [self children].count); 

// fade in all of the labels 

然后,在选项菜单中每个子菜单,它们看起来像这样(使用“商店”作为模型):

position = 4; 
for (SKNode* node in [self children]) { 
    if ([node.name isEqual:@"optionsButton"]) { 
     [node runAction:[SKAction scaleTo:(2.0/3.0) duration:1]]; 
     [node runAction:[SKAction moveTo:CGPointMake(self.size.width/2, self.size.height - (node.frame.size.height * (1.0/3.0))) duration:1]]; 
    } else if ([node.name isEqual:@"store"]) { 
     [node runAction:[SKAction scaleTo:1.5 duration:1]]; 
     [node runAction:[SKAction moveTo:CGPointMake(self.size.width/2, self.size.height - node.frame.size.height * 3) duration:1]]; 
    } else { 
     [node runAction:[SKAction fadeAlphaTo:0 duration:1] completion:^{ 
      [node removeFromParent]; 
     }]; 
    } 
} 

// draw UI for the store and move the back button accordingly 

SKLabelNode *back = [SKLabelNode labelNodeWithFontNamed:@"Cochin"]; 
back.alpha = 0; 
back.fontColor = [UIColor blackColor]; 
back.text = @"back"; 
back.name = @"backa"; 
back.fontSize = 44; 
back.position = CGPointMake(self.size.width/2, self.size.height * 0.5); 

[self addChild:back]; 

[back runAction:[SKAction fadeAlphaTo:1 duration:1]]; 

此代码的结果是,即使在position的值更改为1以表示回到options菜单后,也会执行每种情况。此外,didBeginTouches奇怪地被称为5次,虽然我只在模拟器中“挖掘”了一次屏幕。这里是什么,我有一个日志更多的相关部分:

2015-05-23 01:10:40.581 game[25258:1981445] position: 4 
2015-05-23 01:10:40.581 game[25258:1981445] store back button was pressed and [self options] is being called... 
2015-05-23 01:10:40.582 game[25258:1981445] position: 1 
2015-05-23 01:10:40.588 game[25258:1981445] options called, with 10 nodes in [self children] 
2015-05-23 01:10:40.588 game[25258:1981445] position: 1 
2015-05-23 01:10:40.588 game[25258:1981445] position: 1 
2015-05-23 01:10:40.588 game[25258:1981445] position: 1 
2015-05-23 01:10:40.589 game[25258:1981445] position: 1 
2015-05-23 01:10:40.589 game[25258:1981445] INVALID POSITION: 1 

为什么每case运行,甚至default情况?似乎只有position == 4应该运行case 4而类似position == 500会运行default的情况。如果有帮助,选项菜单中有5个子菜单。

+4

case语句需要以'break'结尾,否则它们将在下一个case中继续。标准C行为。 –

+0

我觉得这样一个白痴没有'休息',那里。谢谢! – DDPWNAGE

回答

1

您需要在每个大小写块的末尾添加一个break语句。

+0

Stack Overflow让我接受这个答案。谢谢你和Gerd K在评论中的发现! – DDPWNAGE