我希望背景固定不同的物体(精灵和其他物体)。
玩家将由将在世界各地移动的中心节点代表。我希望将相机固定到中央节点,例如世界应该移动,相机应该保持静止。
我如何实现这一目标?
答案 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。这取决于首选的滚动类型。
可以通过将相机添加为播放器的子节点来严格附加相机:
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
中将SKCameraNode
与SKConstraint
一起使用
let camera = SKCameraNode()
camera.constraints = [.distance(.init(upperLimit: 10), to: node)]
scene.addChild(camera)
scene.camera = camera