Sprite Kit 相机平滑移动,延迟

Posted

技术标签:

【中文标题】Sprite Kit 相机平滑移动,延迟【英文标题】:Sprite Kit camera smooth movement with delay 【发布时间】:2017-05-12 13:11:25 【问题描述】:

所以,我可以让相机随着播放器移动,但它并没有按照我需要的方式运行。 我已经设置了单词边界:

func keepPlayerInBounds() 
    if player.position.x < frame.minX + player.size.width/2 
        player.position.x = frame.minX + player.size.width/2
    

    if player.position.x > frame.maxX + player.size.width/2 
        player.position.x = frame.maxX + player.size.width/2
    

所以我需要将相机最大和最小 X 设置为最大并在 worldNode 中混合 X 玩家位置。当玩家向右或向左移动时,它会延迟平滑移动。 我试图设置:

override func didFinishUpdate()
    cam.position.x = player.position.x

或者:

override func didFinishUpdate() 
    let move = SKAction.moveTo(x: player.position.x, duration: 0.5)
    cam.run(move)

但它带来了比需要更多的头痛。

问题是:如何设置相机的左右最大位置,并延迟移动它而不会出现错误。我花了将近三个星期来寻找答案,但仍然一无所获。谢谢!

【问题讨论】:

你对“平稳运动”的理解是什么?您遇到了哪些错误或令人头疼的问题? 它正在快速移动或遇到一些障碍 【参考方案1】:

让您的游戏保持在边界内的更简单方法是为玩家设置一个物理体,并为边界设置一个物理体。

var player: SKSpriteNode! //player variable
var map: SKSpriteNode! //this simple node called map is a variable that represents the bounds area, for the example i made it the size of the scene (inside GameScene.sks)

override func didMove(to view: SKView) 
    player = childNode(withName: "player") as! SKSpriteNode // initializing the player from the scene file.
    player.physicsBody = SKPhysicsBody(rectangleOf: player.size) // initializing player physics body(in this example the player is a simple rectangle).

    map = childNode(withName: "map") as! SKSpriteNode // initializing the map from the scene file.
    map.physicsBody = SKPhysicsBody(edgeLoopFrom: map.frame) // instead of assigning a physics body to the scene it self, we created the map variable and assign the physics body to it, the edgeLoopFrom physics body  is a static volume-less body, so the player will not be able to pass through.

    setupCamera() // for the second part of your question we create this method and call it right here in viewDidLoad().

您无需在 update() 方法中不断更新相机位置,您只需添加相机约束即可。 (我也在场景文件中添加了相机)

func setupCamera() 
    guard let camera = camera, let view = view else  return  // make sure we have a camera and a view or else return

    let zeroDistance = SKRange(constantValue: 0)
    let playerConstraint = SKConstraint.distance(zeroDistance,
                                                 to: player) // as the name suggest this is a simple constraint for the player node.
    //next part of the method will assign a second constraint to the camera which will prevent the camera from showing the dark area of the scene in case the player will go to the edge. you don't have to add this part but it is recommended.
    let xInset = min(view.bounds.width/2 * camera.xScale,
                     map.frame.width/2)
    let yInset = min(view.bounds.height/2 * camera.yScale,
                     map.frame.height/2)

    let constraintRect = map.frame.insetBy(dx: xInset,
                                                  dy: yInset)

    let xRange = SKRange(lowerLimit: constraintRect.minX,
                         upperLimit: constraintRect.maxX)
    let yRange = SKRange(lowerLimit: constraintRect.minY,
                         upperLimit: constraintRect.maxY)

    let edgeConstraint = SKConstraint.positionX(xRange, y: yRange)
    edgeConstraint.referenceNode = map

    camera.constraints = [playerConstraint, edgeConstraint] //finally we add the constraints we created to the camera, notice that the edge constraint goes last because it has a higher priority.

【讨论】:

以上是关于Sprite Kit 相机平滑移动,延迟的主要内容,如果未能解决你的问题,请参考以下文章

Sprite-Kit:节点不会向左移动

使用 Sprite Kit 移动背景

Sprite-Kit:移动SKSpriteNode

以一定速度在屏幕上移动对象。(Sprite Kit)

Sprite-Kit:节点不会向左移动

在 Sprite Kit 中永远随机移动精灵的最佳方法