2014-12-30 6 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

texture, projectile 또는 negativeEffect에 액세스하기 전에 setUpValues ​​()를 호출 하시겠습니까? – dustincarr

+0

너희들이 나에게 말하지 않을 때까지 나는 아니었다! @dustincarr –

답변

1

그것은 자신의 속성을 설정하기 전에 클래스처럼 Projectile 전화 super.init()을보고, 결코 당신의 변수 속성 값을 결코 의미에서 모든 setUpValues()를 호출하지 않습니다.

서브 클래스에서 setUpValues ​​함수는 여전히 호출되지 않으며 별도의 init() 함수가 없으므로 동일한 문제입니다. 값이 설정되지 않습니다.

Swift에서 초기화하는 규칙은 Obj-C와는 약간 다릅니다. super.init()을 호출하기 전에 저장된 모든 인스턴스 속성을 초기화해야하며 상속 된 속성을 처리하는 방법을 고려해야합니다. 완전히/적절히 초기화 된 객체를 가진다. 애플의 Swift Programming Guide:

  1. 지정된 초기화에서

    는 동급에 의해 도입 된 모든 속성은 슈퍼 클래스 초기화까지 그것을 전에 위임을 초기화되어 있는지 확인해야합니다.

  2. 지정된 초기화 프로그램은 상속 된 속성에 값을 할당하기 전에 수퍼 클래스 초기화 프로그램을 위임해야합니다. 그렇지 않으면 지정된 초기화 프로그램이 지정하는 새 값이 자체 초기화의 일부로 수퍼 클래스에 의해 겹쳐 쓰여집니다.

+0

! 또한 값을 nil로 초기화합니다. – dustincarr

+0

오른쪽 ... 편집 됨, thanks :) – mc01

+0

고마워요! 그러나 @dustincarr이 말한 것을하는 것이 더 낫다고 생각합니다. SKTexture에 'size'라는 이름의 멤버가 없다는 오류가 발생했습니다. –

관련 문제