【问题标题】:Swift: Simplify menu button logicSwift:简化菜单按钮逻辑
【发布时间】:2017-06-08 03:13:24
【问题描述】:

我有一个 Swift 游戏,其中我的每个关卡都是从基本 GameScene 类继承的一个单独的类(对于我正在做的事情来说,这种方式要容易得多,不要评判我)。 我还有一个菜单,每个级别都有一个按钮。这是按钮加载关卡的方式:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
  if let t = touches.first {
    let node = atPoint(t.location(in: self))
    if let name = node.name {
      let newScene: GameScene!
      switch Int(name)! {
      case 1:
        newScene = Level1(size: frame.size)
      case 2:
        newScene = Level2(size: frame.size)
      case 3:
        newScene = Level3(size: frame.size)
      case 4:
        newScene = Level4(size: frame.size)
      case 5:
        newScene = Level5(size: frame.size)
      case 6:
        newScene = Level6(size: frame.size)
      case 7:
        newScene = Level7(size: frame.size)
      default:
        newScene = Level1(size: frame.size)
      }
      view?.presentScene(newScene, transition: .crossFade(withDuration: 0.5))
    }
  }
}

对我来说,这个开关看起来非常丑陋和毫无意义,但我想不出办法来避免它。我希望这里有人可以帮助我解决这个问题,我只是想不出更好的选择。

【问题讨论】:

    标签: ios swift switch-statement


    【解决方案1】:

    您可以先将关卡的类名构造为字符串"Level\(name)",然后通过将其名称传递给函数来获取您需要的实际类:

    func classFromString(_ className: String) -> AnyClass! {
        let namespace = Bundle.main.infoDictionary!["CFBundleExecutable"] as! String
        let cls: AnyClass = NSClassFromString("\(namespace).\(className)")!
        return cls
    }
    

    使用示例:

    let className = "Level1"
    let levelInstance = (classFromString(className) as! GameScene).init(size: frame.size)
    

    ...当然最好的建议是避免这种架构

    【讨论】:

    • @MysteryPancake 这是另一个问题的主题,有多种方法可以设计游戏关卡架构。就像在构造函数中初始化场景的属性,将索引传递给它,或者将级别的索引映射到结构或枚举中某个位置的适当 GameScenes。既然你说“我正在做的事情这样容易得多,不要评判我”,我就你的具体情况给了你一个提示。如果您觉得我的回答有用,请采纳。干杯 =)
    【解决方案2】:

    您可以这样做:

        var newScene: GameScene!
    
        //Level1 is repeating on 0 and 1'st index
    
        let arrScene : [GameScene] = [Level1(size: frame.size),Level1(size: frame.size),Level2(size: frame.size),Level3(size: frame.size),Level4(size: frame.size),Level5(size: frame.size),Level6(size: frame.size),Level7(size: frame.size)]
    
        if Int(name)! <=7 && Int(name)! > 0{
    
        newScene  = arrScene[Int(name)!]
    
        }else{
    
        //Default level1 
        newScene  = arrScene[0]
    
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-24
      • 2011-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多