代码之家  ›  专栏  ›  技术社区  ›  Jack Richards

如何正确初始化类

  •  0
  • Jack Richards  · 技术社区  · 7 年前

    以下代码在线路上产生错误 pickUp.spawnShield() 每当我尝试调用它时,都会从我的GameSecene类中删除。

    var pickUp: Pickup! 为零。如果是这样,我如何正确初始化它?

    class Pickup {
    
        var game: GameScene!
    
        func spawnShield() {
    
            let randomXStart = Random().random(min: game.gameArea.minX + game.player.size.width/2, max: game.gameArea.maxX - game.player.size.width/2)
    
            let randomXEnd = Random().random(min: game.gameArea.minX + game.player.size.width/2, max: game.gameArea.maxX - game.player.size.width/2)
    
            let startPoint = CGPoint(x: randomXStart, y: game.size.height * 1.1)
            let endPoint = CGPoint(x: randomXEnd, y: -game.size.height * 0.1)
    
            let shield = SKSpriteNode(imageNamed: "shieldDrop")
            shield.setScale(2)
            shield.position = startPoint
            shield.zPosition = 3
    
            game.addChild(shield)
    
            let moveShield = SKAction.move(to: endPoint, duration: TimeInterval(Helper().randomBetweenTwoNumbers(firstNumber: 3, secondNumber: 5)))
    
            shield.run(moveShield)
        }
    }
    

    然后我在课堂上这样称呼它:

    class GameScene: SKScene, SKPhysicsContactDelegate {
    
        var pickUp: Pickup!
    
        override init(size: CGSize) {
    
            ....
    
            pickUp = Pickup() //something like this?
    
            super.init(size: size)
        }
    
        func startNewLevel() {
    
            pickUp.spawnShield()
        }
    }
    
    2 回复  |  直到 7 年前
        1
  •  2
  •   Michael Bernat    7 年前

    首先:您必须创建存储(引用)在var Pickup中的Pickup类的实例。我看不到类似的东西

    class Pickup {
      weak var game: GameScene?
      init(game: GameScene) {
        self.game = game
      }
      func spawnShield() {...}
    }
    
    class GameScene: SKScene, SKPhysicsContactDelegate {
      var pickUp: Pickup!
      override init(size: CGSize) {
        super.init(size: size)
        pickUp = Pickup(game: self)
    }
    

    第二:我不认为有太多的理由让皮卡隐式展开(!)。我宁愿提议 弱var拾取:拾取?

    第三:奇怪的是,您并没有看到缺少初始值设定项的编译器错误,因为您的类中有属性,然后必须定义初始值设定项。别忘了打电话 超级的初始化(…) 在初始化器中,初始化类属性后。

        2
  •  0
  •   Arthur Sahakyan    7 年前

    给,我想你可以这样做

    class GameScene: SKScene, SKPhysicsContactDelegate {
    
        var pickUp = Pikup()
    
        func startNewLevel() {
    
            pickUp.spawnShield()
        }
    }
    

    或者,您可以在调用spawnShield()之前初始化变量“pikUp”,可能是在您编写的init方法中。

    所以还要确保在初始化“game”变量后使用它,因为正如我在代码中看到的那样,它也会崩溃,因为在使用它时它是零。