SpriteKit:如何在跟踪节点时平滑地动画SKCameraNode,但仅在节点移动Y像素后?

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

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

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

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

我们尝试在一段时间内动画摄像机的位置,而不是立即动画,但在update(_ currentTime: CFTimeInterval)内部对镜头运行SKAction update(_ currentTime: CFTimeInterval)无法做任何事情。

我很快就做到了这一点。 我相信这就是你要找的东西? (实际的动画是流畅的,只是我必须压缩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); } } 

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

而是为您的角色节点创建一个子类,并覆盖position属性。 我们基本上说的是,如果你的相机距你的角色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") } }