SKNode не перемещается в запрограммированную позицию

Я создал класс SKNode, который прекрасно работает. Однако я не могу изменить его .position после создания экземпляра.

Кнопка появляется и работает правильно, но просто не меняет положение, когда запрограммировано. Я включил класс, созданный для кнопки ниже, я также добавил код, в котором я создаю экземпляр класса и вызываю позицию узлов.

код класса:

class LButton: SKNode {
    var button: SKSpriteNode
    private var mask: SKSpriteNode
    private var cropNode: SKCropNode
    private var action: () -> Void
    var isEnabled = true
    
   
    
    init(imageNamed: String, buttonAction: @escaping () -> Void) {
        button = SKSpriteNode(imageNamed: imageNamed)
        button.size = CGSize(width: 50.0, height: 50.0*(24/40))
        
        mask = SKSpriteNode(color: SKColor.black, size: button.size)
        mask.alpha = 0
        
        cropNode = SKCropNode()
        cropNode.maskNode = button
        cropNode.zPosition = 3
        cropNode.addChild(mask)
        
        action = buttonAction
        
        super.init()
        
        isUserInteractionEnabled = true
        
        setupNodes()
        addNodes()
        
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    func setupNodes() {
        button.zPosition = 0
    }
    
    func addNodes() {
        addChild(button)
        addChild(cropNode)
    }
    
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        if isEnabled {
            mask.alpha = 0.5
            run(SKAction.scale(by: 1.05, duration: 0.05))
        }
    }
    
    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        if isEnabled {
            for touch in touches {
                let location: CGPoint = touch.location(in: self)
                
                if button.contains(location){
                    mask.alpha = 0.5
                    
                } else {
                    mask.alpha = 0.0
                }
            }
        }
    }
    
    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        if isEnabled {
            for touch in touches {
                let location: CGPoint = touch.location(in: self)
                
                if button.contains(location) {
                    disable()
                    action()
                    run(SKAction.sequence([SKAction.wait(forDuration: 0.2), SKAction.run({self.enable()})]))
                }
            }
        }
    }
    
    
    func disable() {
        isEnabled = false
        mask.alpha = 0.0
        button.alpha = 0.5
    }
    
    func enable() {
        isEnabled = true
        mask.alpha = 0.0
        button.alpha = 1.0
    }
    
}

код экземпляра:

var playButtonTwo: LButton {
        let revealGameScene = SKTransition.fade(withDuration: 0.5)
        let goToGameScene = GameSceneTwo(size: self.size)
        goToGameScene.scaleMode = SKSceneScaleMode.resizeFill
        
        var button = LButton(imageNamed: "playButton", buttonAction: {        self.view?.presentScene(goToGameScene, transition:revealGameScene)
        })
        
        button.zPosition = 5
        button.position = CGPoint(x: -self.frame.width*0.3, y: self.frame.height*0.4)
        return button
    }

вызов для изменения положения узлов:

playButtonTwo.position = CGPoint(x:0, y: -self.frame.height*0.4)

Любые советы приветствуются!


person fergus laidlaw    schedule 06.04.2019    source источник
comment
вызов для изменения положения узлов Где и как вы это вызываете?   -  person El Tomato    schedule 07.04.2019
comment
Этот код помещается в didMove и должен запускаться при загрузке SKScene.   -  person fergus laidlaw    schedule 08.04.2019


Ответы (1)


Я считаю, что вы не должны устанавливать положение кнопки внутри ее создания. Вместо этого просто поместите его в didMove

var playButtonTwo: LButton {
    let revealGameScene = SKTransition.fade(withDuration: 0.5)
    let goToGameScene = GameSceneTwo(size: self.size)
    goToGameScene.scaleMode = SKSceneScaleMode.resizeFill

    var button = LButton(imageNamed: "playButton", buttonAction: {        self.view?.presentScene(goToGameScene, transition:revealGameScene)
    })

    button.zPosition = 5
    // button.position = CGPoint(x: -self.frame.width*0.3, y: self.frame.height*0.4) <- comment out his line 
    return button
}
person Rebeloper    schedule 08.04.2019
comment
Спасибо за ответ! К сожалению, когда я вызываю позицию в didMove, а не внутри ее создания. Кнопка по-прежнему не перемещается в нужное положение, а остается в центре экрана. - person fergus laidlaw; 09.04.2019
comment
Думаю, у меня есть представление о проблеме. Поскольку при инициализации playButtonTwo это переменная только для получения, поэтому ее значения не могут быть изменены. Однако я не знаю, как это исправить. - person fergus laidlaw; 09.04.2019