2017-05-31 98 views
0

我想在我的场景中显示某个奖牌,具体取决于您的高分是基于关卡的目标。如果(变量==变量+5)

// Get Medal Colour 
    if levelHighscore < goalScore { 
     scoreMedal = SKSpriteNode(imageNamed: "noMedal") 
    } else if levelHighscore == goalScore { 
     scoreMedal = SKSpriteNode(imageNamed: "bronzeMedal") 
    } else if levelHighscore > goalScore { 
     scoreMedal = SKSpriteNode(imageNamed: "silverMedal") 
    } 

目前我得到的高分,并将其与目标 - 如果它是低于目标显示noMedal图像。如果它等于目标显示一个铜牌,如果高分比目标显示5银多,并且如果高分比目标高出10分显示一个金牌。

已在此的尝试所有不同的位和鲍勃一段时间,由于某种原因,它的工作原理在上面的设置,但是当我写

// Get Medal Colour 
    if levelHighscore == goalScore+5 { 
     scoreMedal = SKSpriteNode(imageNamed: "silverMedal") 
    } 

它说明不了什么。

+0

也许你想'> ='而不是'==' – James

+0

您需要使用'if'和'if else'来捕获范围而不是特定的值。 – paulvs

+1

开关可能会更适合这个。现在是可能的,但在Swift 4中会更好:https://github.com/apple/swift-evolution/blob/master/proposals/0172-one-sided-ranges.md – PeejWeej

回答

2

你需要你的比较是这样的:

if levelHighscore < goalScore { 
    scoreMedal = SKSpriteNode(imageNamed: "noMedal") 
} else if levelHighscore >= goalScore + 10 { 
    scoreMedal = SKSpriteNode(imageNamed: "goldMedal") 
} else if levelHighscore >= goalScore + 5 { 
    scoreMedal = SKSpriteNode(imageNamed: "silverMedal") 
} else { 
    scoreMedal = SKSpriteNode(imageNamed: "bronzeMedal") 
} 

的重要组成部分,是检查是否有更高的价值,再低的值。

为了使逻辑更清晰,您可以按如下格式代码:

if levelHighscore < goalScore { 
    scoreMedal = SKSpriteNode(imageNamed: "noMedal") 
} else { 
    // We now know the score is greater or equal to goal 
    // First see if it's hight enough for gold 
    if levelHighscore >= goalScore + 10 { 
     scoreMedal = SKSpriteNode(imageNamed: "goldMedal") 
    } else { 
     // Nope, maybe it's silver 
     if levelHighscore >= goalScore + 5 { 
      // Yes, it's 5 or more but less than 10 over so it's silver 
      scoreMedal = SKSpriteNode(imageNamed: "silverMedal") 
     } else { 
      // No, it's less than 5 over leaving bronze 
      scoreMedal = SKSpriteNode(imageNamed: "bronzeMedal") 
     } 
    } 
} 
+0

现货!!!!这按预期工作!我会在7分钟内接受这个答案:) – LukeTerzich

+0

鉴于这里正在发展的末日金字塔,我会推荐至少使用警卫来处理错误(noMedal)的情况。 – PeejWeej

+0

@PEEJWEEJ我不推荐“厄运金字塔”。这仅仅是为了说明的目的。而为什么一个“警卫”呢?检查分数是否不足只是'if/else'中的另一个检查。 – rmaddy

5

取决于你的口味,我觉得这有点更容易阅读和理解。

switch levelHighscore - goalScore { 
case 0 ..< 5:  scoreMedal = SKSpriteNode(imageNamed: "bronzeMedal") 
case 5 ..< 10: scoreMedal = SKSpriteNode(imageNamed: "silverMedal") 
case 10 ... .max: scoreMedal = SKSpriteNode(imageNamed: "goldMedal") 
default:   scoreMedal = SKSpriteNode(imageNamed: "noMedal") 
} 

不过,@ rmaddy的回答非常好。

+0

我喜欢这个。更干净。我花了35年编程C/C++/Java/Objective-C。我在斯威夫特度过了6个月。我需要不断提醒自己,比如更强大和更灵活的Swift'switch'语句。 – rmaddy

0

这里有一些很好的答案,但我会选择做一点不同。

首先,一系列的具体值的适合于使用enum

/// Raw values are the minimum for each Medal type. 
/// For .none the raw value indicates any negative value 
enum Medal: Int { 
    case none = -1 
    case bronze = 0 
    case silver = 5 
    case gold = 10 
} 

然后,我们添加一个初始化,需要一个分和一个进球。我们还添加了一个image属性,返回SKSpriteNode

extension Medal { 
    init(score: Int, goal: Int) { 
    switch score - goal { 
    case Medal.bronze.rawValue ..< Medal.silver.rawValue: self = .bronze 
    case Medal.silver.rawValue ..< Medal.gold.rawValue : self = .silver 
    case Medal.gold.rawValue ..< Int.max    : self = .gold 
    default            : self = .none 
    } 
    } 

    var image: SKSpriteNode { 
    switch self { 
    case .none : return SKSpriteNode(imageNamed: "noMedal") 
    case .bronze: return SKSpriteNode(imageNamed: "bronzeMedal") 
    case .silver: return SKSpriteNode(imageNamed: "silverMedal") 
    case .gold : return SKSpriteNode(imageNamed: "goldMedal") 
    } 
    } 
} 

然后,你可以简单地这样做是为了获得图像:

let image = Medal(score: 14, goal: 10).image 

let image = Medal.bronze.image