在Swift SpriteKit中进行子类化

时间:2014-12-30 22:04:52

标签: xcode swift subclassing exc-bad-instruction

我正在制作一款RPG游戏,您可以在其中选择用户拥有的攻击。我试图让它成为一个名为“Projectile”的超类,其中描述了一般变量,以及改变变量的子类。但每当我覆盖变量的值时,我都会得到一个EXC_BAD_INSTRUCTION。

import Foundation
import SpriteKit

class Projectile: SKNode {


    var texture: SKTexture!
    var projectileBody = SKSpriteNode()
    var projectile: SKEmitterNode!
    var negativeEffect: DefaultNegativeEffect!


    func setUpValues() {

        texture = SKTexture(imageNamed: "bokeh.png")
        projectileBody = SKSpriteNode()
        projectile = SKEmitterNode(fileNamed: "testbokeh.sks")
        negativeEffect = DefaultNegativeEffect(runningSpeed: 0)


    }

     override init() {
        super.init()
        projectileBody.texture = texture
        projectileBody.size = texture.size()
        projectileBody.position = self.position
        self.physicsBody = SKPhysicsBody(circleOfRadius: 2)
        self.physicsBody?.dynamic = true
        self.physicsBody?.categoryBitMask = PhysicsCategory.Projectile
        self.physicsBody?.contactTestBitMask = PhysicsCategory.Monster
        self.physicsBody?.collisionBitMask = PhysicsCategory.None
        self.physicsBody?.usesPreciseCollisionDetection = true
        projectile.position = self.position
        self.addChild(projectileBody)
        self.addChild(projectile)

    }


    func update() {

    }
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

}
import Foundation
import SpriteKit

class FireBall: Projectile {

    override func setUpValues() {

        texture = SKTexture(imageNamed: "spark5.png")
        projectileBody = SKSpriteNode()
        projectile = SKEmitterNode(fileNamed: "testbokeh.sks")
        negativeEffect = DefaultNegativeEffect(runningSpeed: 0)

    }

}

1 个答案:

答案 0 :(得分:1)

在设置自己的属性之前看起来类Projectile调用super.init(),而从不调用setUpValues(),这意味着您的变量属性永远不会有值。

Fireball子类中,仍然没有调用setUpValues函数,并且你没有单独的init()函数,所以它也是同样的问题:没有设置值。 / p>

Swift中的初始化规则与Obj-C略有不同,因为你需要在调用super.init()之前初始化所有存储的实例属性,并且必须考虑如何处理继承的属性以确保你有一个完全/正确初始化的对象。

来自Apple的Swift Programming Guide:

  1. 指定的初始化程序必须确保在委托最新的超类初始化程序之前初始化其类引入的所有属性。

  2. 在为继承的属性赋值之前,指定的初始值设定项必须委托一个超类初始值设定项。如果没有,指定初始化程序分配的新值将被超类覆盖,作为其自身初始化的一部分。