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

时间:2013-12-29 18:33:36

标签: ios sprite-kit

我希望背景固定不同的物体(精灵和其他物体)。

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

我如何实现这一目标?

6 个答案:

答案 0 :(得分:15)

新的SKCameraNode似乎是一种非常简单的方法。

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

简单

1)创建一个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
}

答案 1 :(得分:13)

我意识到这与Stuart Welsh的答案类似;但是,我想让他的答案更加全面。

基本上,Apple建议您创建一个" world"节点包含所有其他节点,世界是实际场景的子节点;而且你创造了一个"相机"节点作为世界节点的子节点。

然后,在您的场景中,您可以执行以下操作:

[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);
}

答案 2 :(得分:5)

这样的事情应该会有所帮助。我从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);
}

答案 3 :(得分:2)

有几种方法可以让相机跟随SKNode。这取决于首选的滚动类型。

  1. 相机严格固定(如射手)
  2. 用于垂直或水平滚动的相机(如平台游戏中)
  3. 可以通过将相机添加为播放器的子节点来严格附加相机:

    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
    // }
    

答案 4 :(得分:1)

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)
}

答案 5 :(得分:1)

Swift 5.1

中将SKCameraNodeSKConstraint一起使用
let camera = SKCameraNode()
camera.constraints = [.distance(.init(upperLimit: 10), to: node)]
scene.addChild(camera)
scene.camera = camera