0

我正在制作一款 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)

    }

}
4

1 回答 1

1

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

Fireball子类中,仍然没有调用 setUpValues 函数,并且您没有单独的 init() 函数,所以这是同样的问题:从未设置过值。

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

来自 Apple 的Swift 编程指南:

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

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

于 2014-12-30T22:39:19.467 回答