我有一个SKNode的子类,它由一些构成玩家的精灵组成。我希望“相机”以这个节点为中心(始终将玩家置于中心)。现在在你投票之前,这是重复的,请听我说。 Apple文档建议使播放器节点完全静止,而是在相机节点周围移动。但是在我的情况下,我将物理的多个属性应用于我的角色,包括速度脉冲。我的第一个想法是将这些脉冲应用到相机节点本身,但由于角色上有一个小的软体物理引擎,这已经变得不可能了。我正在这样应用速度:
player.primaryCircle.physicsBody!.velocity = CGVector(dx: player.primaryCircle.physicsBody!.velocity.dx+relVel.dx*rate, dy: player.primaryCircle.physicsBody!.velocity.dy+relVel.dy*rate)
我设法让它部分使用以下代码:
override func didSimulatePhysics() {
self.player.position = player.primaryCircle.position
self.camera.position = player.position
centerOnNode(camera)
}
func centerOnNode(node: SKNode) {
let cameraPositionInScene: CGPoint = node.scene!.convertPoint(node.position, fromNode: node.parent!)
node.parent!.position = CGPoint(x:node.parent!.position.x - cameraPositionInScene.x, y:node.parent!.position.y - cameraPositionInScene.y)
}
然而,这并不是100%有效,如下所示:(应该关注红圈) http://gyazo.com/b78950e6cc15b60f390cd8bfd407ab56
正如你所看到的,世界/地图正在移动,但它似乎没有足够快的速度将玩家置于中间位置。 (请注意,“Unamed”文本位于屏幕上的固定位置 - 这就是为什么它似乎始终位于中心位置)
答案 0 :(得分:2)
我认为除非我没有真正理解这个问题,否则它仍然适用于物理学。我们使用自动跟踪功能在我们的SKATiledMap上做了类似的事情。你需要做的是确保玩家被添加到你可以作为孩子移动的节点(通常是地图),然后在更新功能中你做这样的事情......(对不起,它不是在swift中)
-(void)update
{
if (self.autoFollowNode)
{
self.position = CGPointMake(-self.autoFollowNode.position.x+self.scene.size.width/2, -self.autoFollowNode.position.y+self.scene.size.height/2);
//keep map from going off screen
CGPoint position = self.position;
if (position.x > 0)
position.x = 0;
if (position.y > 0)
position.y = 0;
if (position.y < -self.mapHeight*self.tileWidth+self.scene.size.height)
position.y = -self.mapHeight*self.tileWidth+self.scene.size.height;
if (position.x < -self.mapWidth*self.tileWidth+self.scene.size.width)
position.x = -self.mapWidth*self.tileWidth+self.scene.size.width;
self.position = CGPointMake((int)(position.x), (int)(position.y));
}
}
映射是添加播放器的节点。希望这会有所帮助。这里还有我们一直在研究的git hub项目的链接。 https://github.com/SpriteKitAlliance/SKAToolKit