gpt4 book ai didi

ios - Objective-C switch 语句的奇怪行为

转载 作者:行者123 更新时间:2023-11-29 12:21:50 25 4
gpt4 key购买 nike

我有一款游戏使用全局整数 position 在选项菜单中导航。当为每个屏幕按下后退按钮时,它会调用函数 [self options] 以重新加载原始“选项”屏幕。我觉得这是我搞砸的非常愚蠢的事情。

现在,调用判断是否返回按钮的函数的代码是这样的:

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

touchIsInNode: 是我自己的自定义方法,用于处理返回 BOOL 值的点击(如果是,则为 YES)。

将每个屏幕的后退按钮命名为 backabackbbackc 等是一种可行的解决方法,但它仍然无论 position 的值如何,都会在每个 switch case 中调用代码。

这是我在 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< 之后,每个 case 都会执行 菜单。此外,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 case?似乎只有 position == 4 应该运行 case 4 而类似 position == 500 的东西会运行 default 案例。如果有帮助,选项菜单中有 5 个子菜单。

最佳答案

您需要在每个 case block 的末尾添加一个 break 语句。

关于ios - Objective-C switch 语句的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30409266/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com