【问题标题】:swift sprite kit - if and switch case not working properlyswift sprite kit - if and switch case不能正常工作
【发布时间】:2014-10-25 01:41:06
【问题描述】:

我这几天一直在尝试完成这项工作,但我不明白我的代码有什么问题。我正在尝试显示玩家的分数。我有两个精灵标签,一个用于第一个数字,一个用于第二个数字。问题是,当数字应该是 1、2 或 7 时,第二个数字不会改变。它适用于其他数字,但不仅仅适用于这些数字,它没有任何意义。

如果您在我的代码中看不到问题,能否建议一种不同的方法来执行此操作,以便我可以忽略此错误?

//scoreVA is the current level/10 
//scoreVB is the number that the first node should have
//scoreVC is the number that the second node should have

var scoreVA = 0.0
var scoreVB = 0.0
var scoreVC = 0.0

这是前 9 个级别和第一个数字的第一个函数

func setLevelLabel(){
        let Number0Icon = SKTexture(imageNamed: "0numbericon.png")
        Number0Icon.filteringMode = .Nearest
        let Number1Icon = SKTexture(imageNamed: "1numbericon.png")
        Number1Icon.filteringMode = .Nearest
        let Number2Icon = SKTexture(imageNamed: "2numbericon.png")
        Number2Icon.filteringMode = .Nearest
        let Number3Icon = SKTexture(imageNamed: "3numbericon.png")
        Number3Icon.filteringMode = .Nearest
        let Number4Icon = SKTexture(imageNamed: "4numbericon.png")
        Number4Icon.filteringMode = .Nearest
        let Number5Icon = SKTexture(imageNamed: "5numbericon.png")
        Number5Icon.filteringMode = .Nearest
        let Number6Icon = SKTexture(imageNamed: "6numbericon.png")
        Number6Icon.filteringMode = .Nearest
        let Number7Icon = SKTexture(imageNamed: "7numbericon.png")
        Number7Icon.filteringMode = .Nearest
        let Number8Icon = SKTexture(imageNamed: "8numbericon.png")
        Number8Icon.filteringMode = .Nearest
        let Number9Icon = SKTexture(imageNamed: "9numbericon.png")
        Number9Icon.filteringMode = .Nearest

        let changeLeveNumberLabel0 = SKAction.setTexture:resize:(Number0Icon, resize: true)
        let changeLeveNumberLabel1 = SKAction.setTexture:resize:(Number1Icon, resize: true)
        let changeLeveNumberLabel2 = SKAction.setTexture:resize:(Number2Icon, resize: true)
        let changeLeveNumberLabel3 = SKAction.setTexture:resize:(Number3Icon, resize: true)
        let changeLeveNumberLabel4 = SKAction.setTexture:resize:(Number4Icon, resize: true)
        let changeLeveNumberLabel5 = SKAction.setTexture:resize:(Number5Icon, resize: true)
        let changeLeveNumberLabel6 = SKAction.setTexture:resize:(Number6Icon, resize: true)
        let changeLeveNumberLabel7 = SKAction.setTexture:resize:(Number7Icon, resize: true)
        let changeLeveNumberLabel8 = SKAction.setTexture:resize:(Number8Icon, resize: true)
        let changeLeveNumberLabel9 = SKAction.setTexture:resize:(Number9Icon, resize: true)
        if(level == 1){
            _levelNumberLabel.runAction(changeLeveNumberLabel1)}
        else if(level == 2){
            _levelNumberLabel.runAction(changeLeveNumberLabel2)}
        else if(level == 3){
            _levelNumberLabel.runAction(changeLeveNumberLabel3)}
        else if(level == 4){
            _levelNumberLabel.runAction(changeLeveNumberLabel4)}
        else if(level == 5){
            _levelNumberLabel.runAction(changeLeveNumberLabel5)}
        else if(level == 6){
            _levelNumberLabel.runAction(changeLeveNumberLabel6)}
        else if(level == 7){
            _levelNumberLabel.runAction(changeLeveNumberLabel7)}
        else if(level == 8){
            _levelNumberLabel.runAction(changeLeveNumberLabel8)}
        else if(level == 9){
            _levelNumberLabel.runAction(changeLeveNumberLabel9)}
        else if(level >= 10){
            _levelNumberLabel2.hidden = false
            scoreVA = Double(level) / 10
            scoreVB = floor(scoreVA)
            scoreVC = ((scoreVA - floor(scoreVA)) * 10)

            if(scoreVB == 1){
                _levelNumberLabel.runAction(changeLeveNumberLabel1)
            } else if(scoreVB == 2){
                _levelNumberLabel.runAction(changeLeveNumberLabel2)
                _levelNumberLabel2.position = CGPointMake(self.frame.size.width * 0.7 + _levelLabel.frame.size.width/2 + _levelNumberLabel.frame.size.width + 5
                    , self.frame.size.height * 0.9)
            }
            else if(scoreVB == 3){
                _levelNumberLabel.runAction(changeLeveNumberLabel3)
            } else if(scoreVB == 4){
                _levelNumberLabel.runAction(changeLeveNumberLabel4)
            } else if(scoreVB == 5){
                _levelNumberLabel.runAction(changeLeveNumberLabel5)
            } else if(scoreVB == 6){
                _levelNumberLabel.runAction(changeLeveNumberLabel6)
            } else if(scoreVB == 7){
                _levelNumberLabel.runAction(changeLeveNumberLabel7)
            } else if(scoreVB == 8){
                _levelNumberLabel.runAction(changeLeveNumberLabel8)
            } else if(scoreVB == 9){
                _levelNumberLabel.runAction(changeLeveNumberLabel9)}

            setLevelLabel2()
            }}

这是第二个无法正常工作的数字的第二个函数

    func setLevelLabel2(){
        // Number textures
        let Number0Icon = SKTexture(imageNamed: "0numbericon.png")
        Number0Icon.filteringMode = .Nearest
        let Number1Icon = SKTexture(imageNamed: "1numbericon.png")
        Number1Icon.filteringMode = .Nearest
        let Number2Icon = SKTexture(imageNamed: "2numbericon.png")
        Number2Icon.filteringMode = .Nearest
        let Number3Icon = SKTexture(imageNamed: "3numbericon.png")
        Number3Icon.filteringMode = .Nearest
        let Number4Icon = SKTexture(imageNamed: "4numbericon.png")
        Number4Icon.filteringMode = .Nearest
        let Number5Icon = SKTexture(imageNamed: "5numbericon.png")
        Number5Icon.filteringMode = .Nearest
        let Number6Icon = SKTexture(imageNamed: "6numbericon.png")
        Number6Icon.filteringMode = .Nearest
        let Number7Icon = SKTexture(imageNamed: "7numbericon.png")
        Number7Icon.filteringMode = .Nearest
        let Number8Icon = SKTexture(imageNamed: "8numbericon.png")
        Number8Icon.filteringMode = .Nearest
        let Number9Icon = SKTexture(imageNamed: "9numbericon.png")
        Number9Icon.filteringMode = .Nearest

        let changeLeveNumberLabel0 = SKAction.setTexture:resize:(Number0Icon, resize: true)
        let changeLeveNumberLabel1 = SKAction.setTexture:resize:(Number1Icon, resize: true)
        let changeLeveNumberLabel2 = SKAction.setTexture:resize:(Number2Icon, resize: true)
        let changeLeveNumberLabel3 = SKAction.setTexture:resize:(Number3Icon, resize: true)
        let changeLeveNumberLabel4 = SKAction.setTexture:resize:(Number4Icon, resize: true)
        let changeLeveNumberLabel5 = SKAction.setTexture:resize:(Number5Icon, resize: true)
        let changeLeveNumberLabel6 = SKAction.setTexture:resize:(Number6Icon, resize: true)
        let changeLeveNumberLabel7 = SKAction.setTexture:resize:(Number7Icon, resize: true)
        let changeLeveNumberLabel8 = SKAction.setTexture:resize:(Number8Icon, resize: true)
        let changeLeveNumberLabel9 = SKAction.setTexture:resize:(Number9Icon, resize: true)

        lastnumb = Int(floor(scoreVC))

        switch(lastnumb){
        case 0..<1:
            _levelNumberLabel2.runAction(changeLeveNumberLabel0)
        case 1..<2:
            _levelNumberLabel2.runAction(changeLeveNumberLabel1)
        case 2..<3:
            _levelNumberLabel2.runAction(changeLeveNumberLabel2)
        case 3..<4:
            _levelNumberLabel2.runAction(changeLeveNumberLabel3)
        case 4..<5:
            _levelNumberLabel2.runAction(changeLeveNumberLabel4)
        case 5..<6:
            _levelNumberLabel2.runAction(changeLeveNumberLabel5)
        case 6..<7:
            _levelNumberLabel2.runAction(changeLeveNumberLabel6)
        case 7..<8:
            _levelNumberLabel2.runAction(changeLeveNumberLabel7)
        case 8..<9:
            _levelNumberLabel2.runAction(changeLeveNumberLabel8)
        case 9..<10:
            _levelNumberLabel2.runAction(changeLeveNumberLabel9)
        default:
            break
        }


    }

【问题讨论】:

  • 该代码是否与其中的SKAction.setTexture:resize:() 一起使用?

标签: swift switch-statement textures case


【解决方案1】:

据我所知,你做的工作比你需要做的要多得多。我认为重构你的函数可能会有所帮助:

func setLevelLabel2() {
    lastnumb = Int(floor(scoreVC))
    println("lastnumb: \(lastnumb)") // is this the right number?

    let icon = SKTexture(imageNamed: "\(lastnumb)numbericon.png")
    icon.filteringMode = .Nearest

    let action = SKAction.setTexture(icon, resize: true)

    _levelNumberLabel2.runAction(action)
}

一般来说,您不希望依赖浮点值(甚至是双精度)来保存整数。它们几乎总是偏离一点点,因此相等比较可能会失败,floor 可能会为您提供与您预期不同的值。

【讨论】:

  • 我很惊讶您如何将代码做得如此之小。现在它似乎不适用于数字 3 和 4。我认为找到另一种获取 scoreVC 的方法将使其工作。
  • 精灵只是没有改变纹理,我通过标签文本使 scoreVC 的值可见,我可以看到它变为 3,但分数标签保持在 2,它几乎从 2 跳跃到 5 并且在它应该更改为 3 和 4 时不会更改为 3 和 4
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多