2016-07-19 3 views
0

제 첫 번째 iPhone 게임에 대해 'Alien'일반용 '청사진'클래스를 작성하려고합니다. 이 클래스는 모든 실제 외계 서브 클래스에 의해 상속 될 소수의 프로퍼티와 메소드를 포함합니다. 즉, Alien에는 실제로 텍스처가 없어야하며 자체 정의 된 값 집합이 없어야합니다.Swift에서 SKSpriteNode를 상속 한 기본 클래스 인스턴스화

//Generic alien type: a blue-print of sorts 
    class Alien:SKSpriteNode{ 

     let velocityVector:CGVector 
     let startPos:CGPoint 

     init(texture:SKTexture, startPosition startPos:CGPoint,moveSpeed: CGFloat,velocityVector:CGVector){ 
      super.init(texture: texture, color: UIColor.clearColor(), size: texture.size()) 

      self.velocityVector = normalizeVector(velocityVector) 
      self.position = position 
     } 

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

때마다 나는 다음과 같은 오류의 소수로 실행이 설정 시도 :

"Use of instance member 'normalizeVector' on type GameScene; did you mean to use a value of type GameScene instead?" 

normalizeVector은 (GameScene 이내) Alien 클래스 위에 기록되는 기능입니다. 이것이 GameScene 내의 정상적인 기능이기 때문에 이것이 무엇을 의미하는지 모르겠습니다. 나는이 비트를 제거하면, 난 여전히 같은 오류가 나타날 수

"Property self.velocityVector is not initialized at super.init call" 

나는 내가 SKSpriteNode의 서브 클래스를 만들고 있어요 때문에 super.init()은 필요하다고 생각했기 때문에 혼란 스러워요하고이 필요하지 않을 것이라고 건네받은 서브 클래스 고유의 프롭퍼티

마지막으로이 청사진 클래스가 "표시"되지 않으므로 실제 텍스처가없는 super.init()을 호출 할 수있는 방법이 있습니까? 클래스/초기화에 대한 사과 문서를 살펴본 후에도 여전히 문제가 있습니다. 어떤 도움이라도 좋을 것입니다.

+0

왜 GameScene에서 'Alien'을 정의하고 있습니까? 별도의 파일이 더 적절할 것입니다. –

+0

@appzYourLife GameScene 외부에서 모든 수업을 작성해야합니까? 일부 조사를 해본 결과 많이 찾지 못했습니까? 게임 논리는 어떻습니까? – Sam

+1

다른 파일을 다른 클래스로 작성하는 것이 좋습니다. [SpriteKit 프로그래밍 가이드] (https://developer.apple.com/library/ios/documentation/GraphicsAnimation/Conceptual/SpriteKit_PG/Introduction/Introduction.html)도 읽어보십시오. –

답변

2

당신은 오류 메시지가 말한대로, 당신은 당신이 super.init를 호출하기 전에 모든 변수를 초기화해야, 우선 문제의 몇 가지를 가지고 :

init(texture:SKTexture, startPosition startPos:CGPoint,moveSpeed: CGFloat,velocityVector:CGVector){ 
    self.velocityVector = Alien.normalizeVector(velocityVector) 
    self.startPos = startPos 

    super.init(texture: texture, color: UIColor.clearColor(), size: texture.size()) 

    self.position = position 
} 

둘째, 당신이있어 같은 소리 하위 클래스 또는 다른 곳에서 normalizeVector을 정의 하시겠습니까? 내가 한 것은 정적 메소드 (이 메소드가 초기화되기 전에 사용 되었기 때문에 인스턴스 메소드가 될 수 없기 때문에)로 정의한 다음 init 메소드에서 사용할 수 있습니다. 함께 넣으면 다음과 같이 보입니다 :

class Alien:SKSpriteNode { 
    static func normalizeVector(vector:CGVector) -> CGVector { 
     let len = sqrt(vector.dx * vector.dx + vector.dy * vector.dy) 

     return CGVector(dx:vector.dx/len, dy:vector.dy/len) 
    } 

    let velocityVector:CGVector 
    let startPos:CGPoint 

    init(texture:SKTexture, startPosition startPos:CGPoint,moveSpeed: CGFloat,velocityVector:CGVector){ 
     self.velocityVector = Alien.normalizeVector(velocityVector) 
     self.startPos = startPos 

     super.init(texture: texture, color: UIColor.clearColor(), size: texture.size()) 

     self.position = position 
    } 

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

@ David Berry 감사합니다. 매우 도움이되었습니다. 나는 왜 내가 수업 내에서 고독한 기능을 호출 할 수 없는지 궁금하다. 내 기능은 당신과 거의 비슷하게 보였지만 클래스 바로 위에있었습니다 (GameScene 내부). 이 오류가 발생했습니다 :''GameScene 유형에 인스턴스 멤버 'normalizeVector'를 사용하고, 대신 GameScene 유형의 값을 사용 했습니까? ' "또한'moveSpeed'가 초기화되지 않는 이유는 무엇입니까? – Sam

+0

'moveSpeed'가 사용되지 않고 있습니다. 다른 용도로 사용하지 않기 때문에,'let moveSpeed ​​: CGFloat'을 만들려는 것입니다.이 경우'super.init'도 호출하기 전에 초기화해야합니다. . 'normalizeVector'에 관해서는 클래스에서 파일 레벨로 꺼내면 여전히 예상대로 작동합니다.아마도 우연히 그것을 다른 수업에 포함 시켰을 것입니까? –

0

velocityVector을 비 선택적 속성으로 선언 했으므로 초기화 프로그램에서 채우지 않으면 컴파일러 오류가 발생합니다.

이 이유 때문에이 줄을 주석 처리하면 컴파일 오류가 발생합니다.

self.velocityVector = normalizeVector(velocityVector) 
관련 문제