2014-12-30 5 views
0

Я делаю игру типа RPG, в которой вы можете выбрать атаку, которую использует ваш пользователь. Я пытаюсь сделать так, чтобы у меня был суперкласс с именем «Projectile», где описываются общие переменные, и подклассы, которые изменяют переменные. Но всякий раз, когда я переопределяю значение переменных, я получаю EXC_BAD_INSTRUCTION.Подкласс в Swift SpriteKit

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) 

    } 

} 
+0

Вы действительно вызываете setUpValues ​​() перед доступом к текстуре, снаряду или отрицательному эффекту? – dustincarr

+0

Я не был, пока вы, ребята, не сказали мне! @dustincarr –

ответ

1

Это выглядит как класс Projectile вызовов super.init() перед установкой своих свойств, и никогда не называет setUpValues() вообще, то есть ваши переменные свойства не имеют значения.

В подклассе Fireball функция setUpValues ​​по-прежнему не вызывается, и у вас нет отдельной функции init(), поэтому это та же проблема: значения никогда не устанавливаются.

Правила инициализации в Swift немного отличаются от Obj-C тем, что вам необходимо инициализировать все сохраненные свойства экземпляра перед вызовом super.init(), а также учитывать, как вы обрабатываете унаследованные свойства, а также для обеспечения того, чтобы вы имеют полностью/правильно инициализированный объект.

От Swift Programming Guide:

  1. Назначенного инициализатора Apple, должен обеспечить, чтобы все свойства введенных его классом инициализируются перед ним делегатами до суперкласса инициализатора.

  2. Назначенный инициализатор должен делегировать до инициализатора суперкласса перед присвоением значения унаследованному свойству. Если это не так, новое значение, назначенное назначенным инициализатором, будет перезаписано суперклассом как часть его собственной инициализации.

+0

Объявление с! также инициализирует значения nil. – dustincarr

+0

Right ... отредактировал, спасибо :) – mc01

+0

Спасибо! Но я думаю, что делать то, что @dustincarr лучше, потому что, когда я попробовал «?» Я получал ошибки, говоря мне, что у SKTexture нет члена с именем 'size' –