[英]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.