如何使相机跟随Sprite Kit中的SKNode?

我想有不同的对象(精灵和其他对象)静止的背景。

玩家将由将在世界各地移动的中心节点代表。 我想把我的相机固定到中央节点,例如世界应该移动,相机应该保持静止。

我如何做到这一点?

像这样的东西应该有所帮助。 我从我的didSimulatePhysics中调用以下内容。

-(void)centerOnNode:(SKNode*)node { CGPoint cameraPositionInScene = [node.scene convertPoint:node.position fromNode:node.parent]; cameraPositionInScene.x = 0; node.parent.position = CGPointMake(node.parent.position.x - cameraPositionInScene.x, node.parent.position.y - cameraPositionInScene.y); } 

我意识到这与斯图尔特·威尔士的答案类似。 不过,我想让他的回答更全面一些。

正如他在评论中提到的68个项目, 这是正确的文件 。 基本上,Applebuild议您创build一个“世界”节点来包含所有其他节点,而世界是实际场景的孩子; 并进一步创build一个“相机”节点作为世界节点的孩子。

那么,从你的场景中,你可以做一些事情:

 [self centerOnCameraNamed:myCameraName]; 

哪个调用方法(也在你的场景中):

 - (void)centerOnCameraNamed:(NSString*)cameraName { SKNode* world = [self childNodeWithName:worldName]; SKNode* camera = [world childNodeWithName:cameraName]; CGPoint cameraPositionInScene = [camera.scene convertPoint:camera.position fromNode:world]; world.position = CGPointMake(world.position.x - cameraPositionInScene.x, world.position.y - cameraPositionInScene.y); } 

新的SKCameraNode似乎是一个非常简单的方法来做到这一点。

https://developer.apple.com/library/ios/documentation/SpriteKit/Reference/SKCameraNode/

只是

1)创build一个SKCameraNode

 // properties of scene class let cam = SKCameraNode() let player = SKSpriteNode() 

2)将其添加到您的场景相机属性

 // In your scene, for instance didMoveToView self.camera = cam 

3)让相机跟随你的玩家位置

 override func update(currentTime: CFTimeInterval) { /* Called before each frame is rendered */ cam.position = player.position } 
 let cam = SKCameraNode() var player: SKSpriteNode? override func didMoveToView(view: SKView) { /* Setup your scene here */ self.camera = cam player = SKSpriteNode(imageNamed: "Player") if player?.position != nil { player!.position = CGPoint(x: size.width / 2, y: size.height - 150) self.addChild(player!) } player?.addChild(cam) } 

有几个方法可以使相机跟随SKNode。 这取决于首选的滚动types。

  1. 照相机是刚性连接(如射手)
  2. 用于垂直或水平滚动的相机(如在平台上)

可以通过添加相机作为播放器的子节点来严格附加相机:

 let player = SKNode() let camera = SKCameraNode() override func didMove(to view: SKView) { addChild(player) player.addChild(camera) } 

在所有的物理更新完成之后,应该注意相机的位置应该被纠正。 否则,如果玩家或其他相机跟随的物体以较大的速度移动,则屏幕会晃动。 这取决于场景节点的更新顺序和相机在节点间的位置。 为了避免这种影响,有必要在方法didSimulatePhysics更新相机的位置:

 let player = SKNode() let camera = SKCameraNode() override func didMove(to view: SKView) { addChild(player) addChild(camera) } // Vertical scrolling, moving only in y-axis override func didSimulatePhysics() { camera.position.y = player.position.y } // Horizontal scrolling, moving only in x-axis // override func didSimulatePhysics() { // camera.position.x = player.position.x // }