es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Scenekit / Spritekit eliminación de nodo causando bloqueo

Lo que estoy tratando de hacer es replicar un medidor de instrumento digital utilizando SpriteKit.

En mi proyecto, tengo que usar una escena de SpriteKit como material para el SCNNode de SceneKit.

Para hacer eso, he creado una subclase de SKScene y la he aplicado como “material.diffuse.contents” del SCNNode.

Todo funciona bien, puedo ver mi SKScene como material del SCNNode.

Aquí está el problema:

Intento animar/replicar la indicación correcta del instrumento basado en un valor que mi aplicación recibe de otra fuente.

Para hacerlo, decido usar SKSceneDelegate y utilizar el método “update(_ currentTime: TimeInterval)”.

Básicamente, el método update busca el nodo SKNode de la aguja verde “fulcro”, lo elimina y crea una nueva línea calculando el ángulo y las nuevas coordenadas para la nueva línea.

override func update(_ currentTime: TimeInterval) {

    guard let fulcroToRemove = self.childNode(withName: "fulcro") else {return}
    fulcroToRemove.removeFromParent() // aquí está el problema...

    let fulcro = SKNode()
    fulcro.name = "fulcro"
    fulcro.position = CGPoint(x: 300, y: 260)
    let line = makeLine(startPos: CGPoint(x: 0, y: 0),
                        endPos: getCoordinate(angleDeg: getCurrentEGT()),
                        name: "EGT_LINE")
    fulcro.addChild(line)
    self.addChild(fulcro)
}

Si pruebo esta SKScene en un proyecto solo con SpriteKit, todo funciona bien. Puedo ver cómo la aguja aumenta correctamente cuando la fuente de datos aumenta.

Pero si uso la misma SKScene como material de SceneKit, obtengo el siguiente error:

Se ve como si estuviera eliminando algo de forma incorrecta y puedo ver que fulcroToRemove.removeFromParent() es la línea que desencadena el error.

Pero ¿por qué? ¿Cómo puedo eliminar la línea para evitar el error?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Replicando un indicador de instrumento digital utilizando SpriteKit y SceneKit

    Problema al actualizar SKScene como material para SCNNode

    El objetivo es animar/replicar la indicación del instrumento basada en un valor recibido. Para lograr esto, se utiliza el método SKSceneDelegate y update(_ currentTime: TimeInterval). Este método busca el nodo fulcro verde, lo remueve y crea una nueva línea con el ángulo y las coordenadas actualizadas.

    Sin embargo, cuando la misma SKScene se utiliza como material para SceneKit SCNNode, se produce un error al intentar eliminar el nodo fulcro con fulcroToRemove.removeFromParent().

    La razón de este error no está clara, pero se puede solucionar comprobando si el nodo fulcroToRemove existe antes de intentar eliminarlo.

    override func update(_ currentTime: TimeInterval) {
        guard let fulcroToRemove = self.childNode(withName: "fulcro") else { return }
    
        // Comprobar la existencia del nodo fulcroToRemove antes de eliminarlo
        if fulcroToRemove.parent != nil {
            fulcroToRemove.removeFromParent()
        }
    
        let fulcro = SKNode()
        fulcro.name = "fulcro"
        fulcro.position = CGPoint(x: 300, y: 260)
        let line = makeLine(startPos: CGPoint(x: 0, y: 0),
                            endPos: getCoordinate(angleDeg: getCurrentEGT()),
                            name: "EGT_LINE")
        fulcro.addChild(line)
        self.addChild(fulcro)
    }
    

    Al comprobar la existencia del nodo fulcroToRemove antes de eliminarlo, se puede evitar el error y el método update se puede utilizar para animar correctamente la aguja del medidor.

Comments are closed.