2016-11-17 52 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是正確的。

關於SKSpriteNode子集中,update方法是通過你添加新的自定義功能,因爲實例方法update(_:)僅供SKScene類是有效的,這只是說,如果沒有顯式調用不執行此功能。

爲了使你的類測試,你可以如下改變你的代碼(我已經改變了只textureForLevel方法只能使這個例子):

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精靈將顯示在屏幕的中心。 2秒後,紋理會改變。

+1

哈,你說得對。代碼很好。只是測試中的一個錯誤。 :) – Crashalot