3

这个问题和其他问题讨论了如何使用 SKCameraNode 跟踪 SpriteKit 中的节点。

但是,我们的需求各不相同。

其他解决方案,例如更新update(_ currentTime: CFTimeInterval)SKScene 中的相机位置,不起作用,因为我们只想在节点将 Y 像素向下移动到屏幕后调整相机位置。

换句话说,如果节点向上移动 10 个像素,相机应该保持静止。如果节点向左或向右移动,相机应该保持静止。

我们尝试随着时间的推移而不是立即为相机的位置设置动画,但是对内部的相机运行 SKActionupdate(_ currentTime: CFTimeInterval)无法执行任何操作。

4

2 回答 2

5

我很快就做了这个。我相信这就是你要找的?(实际动画很流畅,只是我必须压缩 GIF)

在此处输入图像描述

这是更新代码:

-(void)update:(CFTimeInterval)currentTime {
    /* Called before each frame is rendered */

    SKShapeNode *ball = (SKShapeNode*)[self childNodeWithName:@"ball"];
    if (ball.position.y>100) camera.position = ball.position;

    if (fabs(ball.position.x-newLoc.x)>10) {
        // move x
        ball.position = CGPointMake(ball.position.x+stepX, ball.position.y);
    }

    if (fabs(ball.position.y-newLoc.y)>10) {
        // move y
        ball.position = CGPointMake(ball.position.x, ball.position.y+stepY);
    }
}
于 2016-12-05T09:23:03.133 回答
3

我不会把它放在更新代码中,尽量让你的更新部分保持整洁,记住你只有 16ms 可以使用。

而是为您的角色节点创建一个子类,并覆盖位置属性。我们基本上要说的是,如果您的相机距离您的角色 10 像素,请向您的角色移动。我们在动作上使用一个键,这样我们就不会叠加多个动作,并使用一个计时模式来让相机平稳地移动到您的位置,而不是瞬间完成。

class MyCharacter : SKSpriteNode
{
    override var position : CGPoint
    {
        didSet
        {

            if let scene = self.scene, let camera = scene.camera,(abs(position.y - camera.position.y) > 10)
            {
                let move = SKAction.move(to: position, duration:0.1)
                move.timingMode = .easeInEaseOut
                camera.run(move,withKey:"moving")
            }
        }
    }
}

编辑:@Epsilon 提醒我 SKActions 和 SKPhysics 直接访问变量而不是通过存储的属性,所以这不起作用。在这种情况下,请在 didFinishUpdate 方法中执行此操作:

override func didFinishUpdate()
{
    //character should be a known property to the class,  calling find everytime is too slow
    if let character = self.character, let camera = self.camera,(abs(character.position.y - camera.position.y) > 10)
    {
        let move = SKAction.move(to: character.position, duration:0.1)
        move.timingMode = .easeInEaseOut
        camera.run(move,withKey:"moving")
    }
}
于 2016-12-05T12:52:19.913 回答