ios - SpriteKit Physics Juntas corruptas para escena en movimiento
sprite-kit game-physics (1)
Hay dos requisitos para usar uniones con la física de SpriteKit:
- Define las uniones en el espacio del mundo (escena).
- No muevas el mundo.
A partir de sus preguntas y comentarios, parece que obtuvo el número 1 correcto: cuando la articulación se encuentra entre nodos que no son directos de la escena, debe convertir las coordenadas en el espacio de la escena antes de usarlas para definir una articulación.
Sin embargo, la física de SpriteKit no lo maneja bien cuando intenta mover el sistema de coordenadas raíz. Entonces, implementar una "cámara" moviendo el mundo causa problemas para las articulaciones. En lugar:
Si puede permitirse apuntar solo a iOS 9.0 / OS X 10.11 / tvOS 9.0 y superior, use
SKCameraNode
lugar de mover el mundo. ¡Es más fácil también!(Si te estás preguntando si solo puedes admitir iOS 9, comprueba las estadísticas de tasa de adopción y compáralo con tu programa de desarrollo ... si no vas a enviar por un tiempo, iOS 9 podría ser el sistema operativo "-1" versión en el momento en que haya terminado. Recuerde también que existe una alta correlación entre los clientes entusiastas y los primeros usuarios).
Si todavía está utilizando iOS 8 / OS X 10.10, intente agregar una capa adicional a su escena: falsifique una cámara moviendo un nodo que sea un elemento secundario de su escena y el elemento principal de todo el contenido de su juego.
Creé una escena de SpriteKit con cuerpos de física. Esto está funcionando bastante bien. También estoy desplazando la escena, usando las mejores prácticas de Apple con un "nodo de cámara".
Mi árbol de nodos de escenas es así:
Scene
|- World
|- Camera node
|- Game nodes with physics bodys
Mi problema es que durante el juego creo nuevos nodos con nuevas articulaciones (principalmente articulaciones fijas) dinámicamente. En ese punto, el nodo mundial tiene una posición diferente a la del principio (por ej .: al inicio (0,0), durante el juego (1000,500) ..) Ahora, el punto de anclaje para las uniones fijas no está en el posición que quiero, está en algún lugar de la escena.
Supongo que el sistema de coordenadas de la escena es diferente al sistema de coordenadas del motor de física.
Para el punto de anclaje, utilizo la siguiente conversión:
[world.scene convertPoint:node.position fromNode:node.parent];
Quiero establecer el punto de anclaje en la posición de "nodo". Después de mover el nodo mundial, el cálculo del punto de anclaje ya no funciona.
¡Gracias por tu ayuda!
Greetz - Nekro
Actualizar:
Codificar para centrar escena en el reproductor
- (void)centerOnNode:(SKNode*)node {
CGPoint cameraPositionInScene = [node.scene convertPoint:node.position fromNode:node.parent];
node.parent.position = CGPointMake(node.parent.position.x - cameraPositionInScene.x, node.parent.position.y - cameraPositionInScene.y);
}