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 に答える