Изменение текстуры для подкласса SKSpriteNode?

Предполагается, что функция update в классе ниже, который является подклассом SKSpriteNode, изменяет текстуру класса. Согласно этот ответ SO, обновления свойства texture достаточно для изменения текстуры 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")
    }

person Crashalot    schedule 17.11.2016    source источник


Ответы (1)


Ваш код работает хорошо. На самом деле этот SO ответ правильный.

Что касается подкласса 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 секунды текстура изменится.

person Alessandro Ornano    schedule 17.11.2016
comment
Ха, ты прав. Код в порядке. Просто ошибка в тестировании. :) - person Crashalot; 17.11.2016