2017-05-31 67 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