我有一个游戏使用全局整数position
来浏览选项菜单。当每个屏幕都按下后退按钮时,它会调用功能[self options]
重新加载原始“选项”屏幕。我有一种感觉,这是非常愚蠢的东西我搞砸了。Objective-C switch语句的奇怪行为
现在,调用确定背部按钮是否是这个函数的代码:
if ([self touchIsInNode:[self childNodeWithName:@"back"] touchPoint:touchPoint]) {
// stuff should happen here
}
随着touchIsInNode:
是处理水龙头返回BOOL
值自己的自定义方法(YES
如果是) 。
命名为每个屏幕backa
,backb
,backc
等的后退按钮的按钮是一个可行的解决办法,但它仍然呼叫在每个开关情况下,代码不管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个子菜单。
case语句需要以'break'结尾,否则它们将在下一个case中继续。标准C行为。 –
我觉得这样一个白痴没有'休息',那里。谢谢! – DDPWNAGE