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.

Clase SKScene colapsando, “No se puede agregar el cuerpo …”

Para lograr una simplicidad visual y colocar el nodo en la ubicación correcta, creo un archivo.sks llamado “ECAM_DOOR.sks”.

Para agregar algo de lógica a mi aplicación, luego creo otra escena donde quiero cargar la escena que creé desde el editor.

Pero estoy obteniendo el siguiente error:


Terminación de la aplicación debido a una excepción no capturada ‘No se puede agregar el cuerpo, ya existe en un mundo’, motivo: ‘No se puede agregar el cuerpo de tipo representado por el objeto: [ nombre: ‘Doors’ marco: {{-512, -512}, {1024, 1024}} ancla: {0.5, 0.5}], ya existe en un mundo’


import Foundation
import SpriteKit
import SceneKit

class DOORS: SKScene, SKSceneDelegate {

var systems: PlaneSystems

init(size: CGSize, systems: PlaneSystems) {
self.systems = systems
super.init(size: size)
self.isPaused = false
delegate = self
prepareScene()
}

required init?(coder aDecoder: NSCoder) {
fatalError(“init(coder:) has not been implemented”)
}

func prepareScene() {

guard let scene = SKScene(fileNamed: "/Asset.scnassets/ECAM_SYSTEM/ECAM_DOOR.sks") else {
    print("fail load ref door")
    return
}


self.addChild(scene)

}
}

“`

¿Cómo debo cargar el archivo sks en mi clase personalizada DOORS?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error sugiere que el SKPhysicsBody representado por un rectángulo ya existe en un mundo. Esto suele ocurrir cuando se intenta agregar un cuerpo de física a un nodo que ya lo tiene. En este caso, es probable que el archivo.sks que se carga en la clase personalizada DOORS ya tenga asociado un cuerpo de física con uno de sus nodos.

    Para cargar el archivo ECAM_DOOR.sks en la clase DOORS, puedes utilizar la clase SKReferenceNode. Esta clase te permite cargar una SKScene desde un archivo .sks externo y agregarlo a la escena actual como un nodo secundario. Aquí tienes una versión actualizada de la función prepareScene que utiliza SKReferenceNode:

    func prepareScene() {
        guard let refDoor = SKReferenceNode(fileNamed: "ECAM_DOOR") else {
            print("no se pudo cargar la puerta de referencia")
            return
        }
        self.addChild(refDoor)
    }
    

    Ten en cuenta que el nombre de archivo en el constructor de SKReferenceNode debe coincidir con el nombre del archivo .sks que deseas cargar (sin la extensión .sks).

Comments are closed.