将场景锁定到精灵节点 swift xcode

Locking scene to a sprite node swift xcode

基本上,我想移动角色(玩家)并让“相机”或场景跟随他们。问题是 Apple/xcode 没有内置相机节点,如果我尝试移动场景,我会收到一条错误消息,提示“无法移动 SKScene”。我不想只是移动背景并将玩家锁定到位,因为我希望能够对玩家节点施加力。我已访问 Apple 网站的“高级场景处理”页面并按照示例进行操作,但它不起作用。我只需要朝着正确的方向轻推。谢谢!

代码:

(I have deleted pieces of code that are irrelevant)

class PlayScene: SKScene, SKPhysicsContactDelegate {

let world = SKNode()

let player = SKShapeNode(circleOfRadius: 25)

var cannonRotation = 0.0
var fired = false

override func didMoveToView(view: SKView) {

    physicsWorld.contactDelegate = self

    self.anchorPoint = CGPoint(x: 0.5, y: 0.5)
    self.addChild(world)

    //Adds the background to the world

    //Adds the elements to the scene
    player.fillColor = UIColor.whiteColor()
    player.position = CGPoint(x: CGRectGetMidX(self.frame), y: CGRectGetMinY(self.frame)+65+25)
    player.zPosition = 2
    player.physicsBody = SKPhysicsBody(circleOfRadius: 25)
    player.physicsBody?.dynamic = true
    player.physicsBody?.restitution = 0.9
    player.physicsBody?.categoryBitMask = BodyType.player.rawValue

    //Adds the physics properties to GameScene
    let physicsGround = SKPhysicsBody(edgeFromPoint: CGPoint(x: CGRectGetMinX(self.frame), y: CGRectGetMinY(self.frame)+65), toPoint: CGPoint(x: CGRectGetMaxX(self.frame), y: CGRectGetMinY(self.frame)+65))
    self.physicsBody = physicsGround

}

override func touchesEnded(touches: NSSet, withEvent event: UIEvent) {

    powerLevel()
    totalPower = powerReached * playCannon.powerMultiplier

    self.addChild(player)
    player.physicsBody?.applyImpulse(CGVector(dx: CGFloat(Float(totalPower)*cosf(Float(cannonRotation))), dy: CGFloat(Float(totalPower)*sinf(Float(cannonRotation)))))

    fired = true

}

覆盖 didsimulatePhysics,并在该函数中调用此

self.centerOnNode(player);

它的作用是,它调用我们稍后将创建的函数并发送 SKNode 的参数,在您的情况下它是 player 节点。接下来创建一个名为 centerOnNede 的方法并添加以下参数

func centerOnNode(node: SKNode) {

}

centerOnNode 函数中添加以下代码行。

 var cameraPosition: CGPoint = node.scene?.convertPoint(node.position, fromNode: node.parent!)
    cameraPosition.x = 0

    let posX = node.parent?.position.x
    let posY = node.parent?.position.y

    node.parent?.position = CGPointMake(posX! - cameraPosition.x, posY! - cameraPosition.y)

这将使相机在节点上居中并更新它的位置。从这里转换的代码。 How to make camera follow SKNode in Sprite Kit?

Apple Adventure参考游戏中有how to do this的详细示例。它有 Swift 和 Objective-C 个例子。

总而言之,他们推荐的是

  1. 将所有节点放在后台节点(SKNode)容器中。
  2. 实施 didSimulatePhysics 并向玩家相反的方向移动世界。这将使玩家保持在屏幕中间。如果你想让相机撞到你的世界的边缘,就需要特殊的逻辑。

相机节点会很有帮助,但尚未在 SpriteKit 中实现。

从 iOS9 开始,现在有一个 SKCameraNode 可以为您完成所有繁重的工作。

只需在您的 didMoveToView 函数中添加以下三行代码:

    let cameraNode = SKCameraNode()
    self.addChild(cameraNode)
    self.camera = cameraNode

然后在您的 didFinishUpdate 函数中将 cameraNode 的位置设置为您希望它跟随的任何 SKSpriteNode。