Sprite Kit Camera on Node

Hice un juego de plataforma y apunté la camera al nodo principal Player.

He revisado el documento de Apple que se puede encontrar aquí: Apple

Hay alnetworkingedor de 6 plataforms, con self.frame.size.height / 4.5 espacio entre ellas, que deberían reaparecer cada vez que están bajo dy = -15 en la parte superior de la pantalla nuevamente, para hacer que sea un ciclo infinito.

Recibí un nodo Player, que recibe un impulso cada vez que se toca la pantalla (el jugador salta hacia arriba y hacia abajo). Todo el juego solo se mueve sobre el y-Axis .

La camera que creé está enfocada en el jugador, cada vez que el jugador salta las plataforms se mueven hacia abajo y el jugador se mueve hacia arriba. Sin embargo, esta es solo la vista, y no la position del mundo real. Eso significa que las posiciones dadas en SpawnPlatforms son siempre las mismas, porque no se mueven, solo la vista que se pega al jugador se mueve hacia arriba y hacia abajo.

Quiero tener la camera en mi nodo de jugador, que se mueve en el eje y, mientras sube más, las plataforms también deben moverse hacia abajo, en este momento solo cambia la vista y no puedo trabajar con la actualización: Método para reaparecer las plataforms. ¿Cómo puedo cambiar eso?

Editar : Conseguí que mi Código funcione con la actualización en la Update:Method , pero esto todavía no responde a mi Pregunta inicial, cómo mover todo el mundo con la Cámara, no solo con la Cámara.

 override func didMoveToView(view: SKView) { /* Setup your scene here */ self.physicsWorld.contactDelegate = self self.anchorPoint = CGPoint(x: 0, y: 0.30) backgroundColor = SKColor(networking: 81.0/255.0, green: 192.0/255.0, blue: 201.0/255.0, alpha: 1.0) self.World = SKNode() self.World.name = "World" addChild(World) self.Camera = SKNode() self.Camera.name = "Camera" self.World.addChild(Camera) SpawnPlatforms() SpawnPlayer() } func SpawnPlatforms() { Platform0 = SKSpriteNode (color: SKColor.greenColor(), size: CGSize(width: self.frame.size.width , height: 25)) Platform0.position = CGPoint(x: self.frame.size.width / 2, y: -36) Platform0.zPosition = 1 Platform0.physicsBody = SKPhysicsBody(rectangleOfSize:Platform0.size) Platform0.physicsBody?.dynamic = false Platform0.physicsBody?.allowsRotation = false Platform0.physicsBody?.restitution = 0 Platform0.physicsBody?.usesPreciseCollisionDetection = true Platform0.physicsBody?.categoryBitMask = Platform0Category Platform0.physicsBody?.collisionBitMask = PlayerCategory Platform0.physicsBody?.contactTestBitMask = PlayerCategory World.addChild(Platform0) ....//Same code for the other Platforms1-5 } func SpawnPlayer(){ Player = SKSpriteNode (imageNamed: "Image.png") Player.size = CGSize(width: 64, height: 64) Player.position = CGPoint(x: self.frame.size.width / 2, y: 0) Player.zPosition = 2 Player.physicsBody = SKPhysicsBody(rectangleOfSize:CGSize(width: 35, height: 50)) Player.physicsBody?.dynamic = true Player.physicsBody?.allowsRotation = false Player.physicsBody?.restitution = 0 Player.physicsBody?.usesPreciseCollisionDetection = true Player.physicsBody?.categoryBitMask = PlayerCategory Player.physicsBody?.collisionBitMask = Platform0Category Player.physicsBody?.contactTestBitMask = Platform0Category | Platform1Category | Platform2Category | Platform3Category | Platform4Category | Platform5Category World.addChild(Player) } override func didSimulatePhysics() { Camera.position = CGPoint(x: Player.position.x, y: Player.position.y) self.centerOnNode(Camera!) } func centerOnNode(node: SKNode) { let cameraPositionInScene: CGPoint = Camera.scene!.convertPoint(Camera.position, fromNode: World) World.runAction(SKAction.moveTo(CGPoint(x:World.position.x , y:World.position.y - cameraPositionInScene.y), duration: 1.0)) } override func update(currentTime: CFTimeInterval) { /* Called before each frame is rendenetworking */ if(Player.position.y > (Platform3.position.y + 30) && Player.position.y < Platform4.position.y){ Platform1.position = CGPointMake(self.frame.size.width / 2, Platform6.position.y + self.frame.size.height / 4.5) Platform1.color = SKColor.networkingColor() } ...//Same code for the other Platforms1-5 } 

Cree un SKNode y llamémosle map. Agrega el map como hijo de esta escena. Agrega cada otro nodo de juego como un elemento secundario de este map (plataforms, reproductor, etc.).

Entonces, en lugar de mover node.parent, mueves el map. Esto hará que las plataforms siempre tengan la misma position aunque mueva la camera.

Además, puede agregar menus de juego a la escena y no se moverán, pero el map lo hará.

Por ejemplo, el siguiente código moverá el map en update: método con una velocidad lineal:

kScrollScenarioFactor puede ser como 200.f

 -(void)update:(CFTimeInterval)currentTime { //Calculating time for realistic scroll speed float scrollTime = currentTime - self.lastTime; self.lastTime = currentTime; self.map.position = CGPointMake(map.position.x - (scrollTime * self.kScrollScenarioFactor), map.position.y); } 

O si desea mover el map según el jugador dentro de la update: método, puede ver este enfoque:

 -(void)update:(CFTimeInterval)currentTime { //Calculating playerPosition difference float diffX = self.lastPlayerPosition.x - self.player.position.x; float diffY = self.lastPlayerPosition.y - self.player.position.y; self.lastPlayerPosition = self.player.position; //Updating map position self.map.position = CGPointMake(map.position.x + diffX, map.position.y + diffY); } 

Si tienes un background de desplazamiento, haz tres capas en el juego:

  • Capa de primer plano: contiene el jugador, la plataforma y cualquier otro en los nodos del juego.
  • Capa de background: contiene los backgrounds que se mueven una cierta cantidad a medida que el jugador se mueve.
  • HUD: para todos los nodos relacionados de puntuación que permanecerán en sus posiciones, independientemente de los antecedentes y las posiciones de los jugadores.

Ahora, según mi comprensión de su problema, todas sus plataforms tienen posiciones pnetworkingefinidas en la escena, que no cambian. Solo cambia la position del nodo del jugador y, por lo tanto, desea que el nodo de la camera siga al jugador y mueva al mundo con él. Si este es el caso, entonces podría intentar esto:

Los SKNode no tienen contenido visual, pero sí tienen una position en la escena. Esto significa que puede mover el nodo y sus nodos secundarios se moverán con él

Inicialmente agregue las siguientes properties de class:

 var backgroundNode: SKNode! var foregroundNode: SKNode! var hudNode: SKNode! var player: SKNode! var platformType: PlatformType! 

// Añadir nodo de background

  func createBackgroundNode() -> SKNode { let backgroundNode = SKNode() let node = SKSpriteNode(imageNamed:"") node.position = CGPoint(x: xPosition , y: yPosition) backgroundNode.addChild(node) return backgroundNode } 

Entonces llama a esto en la escena del juego

 backgroundNode = createBackgroundNode() addChild(backgroundNode) 

Ahora para agregar el jugador:

 func createPlayer() -> SKNode { let playerNode = SKNode() playerNode.position = CGPoint(x: x.position, y: y.position) let sprite = SKSpriteNode(imageNamed: "Player") playerNode.addChild(sprite) return playerNode } 

Para agregar el reproductor, crearemos la capa de primer plano y luego la agregaremos. Ponga esto justo debajo de donde agregó backgroundNode.

 foregroundNode = SKNode() addChild(foregroundNode) player = createPlayer() foregroundNode.addChild(player) 

Finalmente, la plataforma que desea agregar, puede agregarla como:

 func createPlatformAtPosition(position: CGPoint) -> PlatformNode { let node = PlatformNode() let thePosition = CGPoint(x: position.x, y: position.y) node.position = thePosition node.name = "NODE_PLATFORM" var sprite: SKSpriteNode sprite = SKSpriteNode(imageNamed: "Platform") node.addChild(sprite) return node } 

Por último, agrega esto a Game Scene en foregroundNode.addChild (jugador)

  let platform = createPlatformAtPosition(CGPoint(x: 300, y: 270) foregroundNode.addChild(platform) 

Espero que esto te ayude un poco.