[英]Odd behavior with Objective-C switch statement
I have a game that uses a global integer position
to navigate around the options menu. 我有一个使用全局整数
position
在选项菜单中导航的游戏。 When the back button is pressed for every screen, it calls a function, [self options]
, to reload the original "options" screen. 当为每个屏幕按下返回按钮时,它将调用函数
[self options]
,以重新加载原始的“ options”屏幕。 I have a feeling that this is something extremely silly I messed up. 我感觉这是我弄得很傻的东西。
Now, the code that calls the function that determines whether or not the back button is this: 现在,调用确定后退按钮是否为以下函数的代码:
if ([self touchIsInNode:[self childNodeWithName:@"back"] touchPoint:touchPoint]) {
// stuff should happen here
}
With touchIsInNode:
being my own custom method for handling taps returning a BOOL
value ( YES
if it was). 使用
touchIsInNode:
是我自己的自定义方法,用于处理返回BOOL
值的水龙头(如果YES
则为YES
)。
Naming the buttons for the back buttons for each screen backa
, backb
, backc
, etc. is a viable workaround, but it still calls the code in each switch case regardless of the value of position
. 为每个屏幕
backa
, backb
, backc
等命名后退按钮是一种可行的解决方法,但是无论position
的值如何,它仍会在每种开关情况下调用代码。
Here's what I have going on in my switch
statement: 这是我在
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;
}
}
}
My options
method looks like this: 我的
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
Then, for each submenu in the options menu, they look like this (using the "store" one as a model): 然后,对于选项菜单中的每个子菜单,它们看起来都像这样(使用“存储”作为模型):
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]];
The result of this code is, each case is executed, even after position
's value has changed to 1
to signify going back to the options
menu. 即使
position
的值已更改为1
表示返回到options
菜单,该代码的结果也会在每种情况下执行。 Also, didBeginTouches
is oddly called 5 times although I only "tapped" the screen once in the simulator. 同样,
didBeginTouches
被奇怪地调用了5次,尽管我在模拟器中只“轻按”了一次屏幕。 Here are the more relevant parts of what I have for a log: 以下是与日志相关的部分:
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
Why does every case
run, even the default
case? 为什么每个
case
运行,甚至是default
案例? It seems like only position == 4
should run case 4
and something like position == 500
would run the default
case. 似乎只有
position == 4
才能运行case 4
,而position == 500
类的东西可以运行default
情况。 If it helps, there are 5 sub-menus in the options menu. 如果有帮助,则选项菜单中有5个子菜单。
您需要在每个case块的末尾添加一个break语句。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.