2016-11-17 16 views
1

以下のクラスのupdateは、SKSpriteNodeのサブクラスであり、クラスのテクスチャを変更することになっています。 this SO answerによれば、textureプロパティを更新するだけで、SKSpriteNodeのテクスチャを変更することができます。ただし、このコードは機能しません。SKSpriteNodeのサブクラスのテクスチャを変更していますか?

なぜでしょうか?

class CharacterNode: SKSpriteNode {  
    let spriteSize = CGSize(width: 70, height: 100) 

    var level = 0 

    init(level: Int) { 
     self.level = level 
     super.init(texture: nil, color: UIColor.clear, size: spriteSize) 
    } 


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


    func update(level: Int) { 
     self.level = level    
     self.texture = textureForLevel(level: level) 
    } 


    func textureForLevel(level: Int) -> SKTexture { 
     return SKTexture(imageNamed: "TestTexture") 
    } 

答えて

1

コードはうまくいきます。実際にはこれはSO answerです。インスタンスメソッドupdate(_:)のみSKSceneクラスに対して有効であるため

についてSKSpriteNodeサブクラスは、update方法は、あなたが追加した新しいカスタム関数で、これはちょうどそれが明示的に呼び出されていない場合は、この機能が実行されていないと言うこと。

class CharacterNode: SKSpriteNode { 
    let spriteSize = CGSize(width: 70, height: 100) 
    var level = 0 
    init(level: Int) { 
     self.level = level 
     super.init(texture: nil, color: UIColor.clear, size: spriteSize) 
    } 
    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 
    func update(level: Int) { 
     self.level = level 
     self.texture = textureForLevel(level: level) 
    } 
    func textureForLevel(level: Int) -> SKTexture { 
     if level == 3 { 
      return SKTexture(imageNamed: "TestTexture3.jpg") 
     } 
     return SKTexture(imageNamed: "TestTexture.jpg") 
    } 
} 

class GameScene: SKScene { 
    override func didMove(to view: SKView) { 
     let characterNode = CharacterNode(level:2) 
     characterNode.update(level:2) 
     addChild(characterNode) 
     characterNode.position = CGPoint(x:self.frame.midX,y:self.frame.midY) 
     characterNode.run(SKAction.wait(forDuration: 2.0), completion: { 
      characterNode.update(level:3) 
     }) 
    } 
} 

あなたがGameScene characterNodeを起動したとき、あなたが見ることができるように:あなたは(私はこの例を作成するだけtextureForLevel方法を変更した)以下のようにコードを変更することができ、あなたのクラスについてテストを行うことが

スプライトが画面の中央に表示されます。 2秒後に、テクスチャが変わります。

+1

ハァッ、そうです。コードは問題ありません。テストのバグ。 :) – Crashalot

関連する問題