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?
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
yupdate(_ currentTime: TimeInterval)
. Este método busca el nodofulcro
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 paraSceneKit SCNNode
, se produce un error al intentar eliminar el nodofulcro
confulcroToRemove.removeFromParent()
.La razón de este error no está clara, pero se puede solucionar comprobando si el nodo
fulcroToRemove
existe antes de intentar eliminarlo.Al comprobar la existencia del nodo
fulcroToRemove
antes de eliminarlo, se puede evitar el error y el métodoupdate
se puede utilizar para animar correctamente la aguja del medidor.