簡體   English   中英

如何正確初始化類

[英]How to initialise classes correctly

每當我嘗試調用以下代碼時,GameScene類中的以下代碼都會在pickUp.spawnShield()行上產生錯誤。

盡管我認為可能與我的var pickUp: Pickup!這個事實有關,但編譯器沒有給出有關導致錯誤的原因的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()
    }
}

首先:您必須創建一個存儲在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拾取:拾取? 避免參考周期(如果以周期為參考)

第三:很奇怪,您沒有看到缺少初始化程序的編譯器錯誤,因為您在類中具有屬性,然后必須定義初始化程序。 在初始化類屬性之后,不要忘記在初始化器中調用super.init(...)

在這里,我想你可以做這樣的事情

class GameScene: SKScene, SKPhysicsContactDelegate {

    var pickUp = Pikup()

    func startNewLevel() {

        pickUp.spawnShield()
    }
}

或者您可以在調用spawnShield()之前初始化變量“ pikUp”,也許可以在編寫時使用init方法。

因此還請確保在初始化后使用“游戲”變量,因為正如我在您的代碼中看到的那樣,由於使用變量時它為nil,它也會崩潰。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM