我正在使用 Spritekit 和 Swift 开发一款横向卷轴游戏。我不明白如何定义比屏幕大的可玩区域并将相机置于播放器的中心。如何做到这一点?
这是我当前的代码,我尝试创建一个“世界节点”,我可以移动它来模拟相机,但它在某种程度上与其形状脱节,我无法让玩家进入其中。
override func didMoveToView(view: SKView) {
self.anchorPoint = CGPointMake(0.5, 0.5)
self.physicsWorld.contactDelegate = self
self.size = CGSizeMake(view.bounds.size.width, view.bounds.size.height)
// Add world
let r : CGRect = CGRectMake(0, 0, 500, 500)
world = SKShapeNode(rectOfSize: r.size)
world.physicsBody = SKPhysicsBody(edgeLoopFromRect: r)
world.strokeColor = SKColor.blackColor()
world.position = CGPointMake(0, 0)
self.addChild(world)
// Add player
player = SKShapeNode(rectOfSize: CGSize(width: 50, height: 50))
player.physicsBody = SKPhysicsBody(rectangleOfSize: CGSize(width: 50, height: 50))
player.fillColor = SKColor.blackColor()
player.position = CGPointMake(0, 0)
world.addChild(player)
// Accelerometer updates
motionManager.startAccelerometerUpdates()
}
最佳答案
Apple 文档中的示例位于 Advanced Scene Processing 中部分。 Apple 建议将“世界”SKNode 作为场景的子级,并将“相机”SKNode 作为世界的子级。
他们建议在 didSimulatePhysics 步骤中不断移动世界,使其以相机为中心。如果您愿意,此方法允许您在相机本身上执行操作或模拟物理。如果您在此步骤之前将相机居中,您将无法使用物理来影响相机节点。
如果您特别只想向左和向右滚动,只需将移动限制在 X 轴即可。
编辑: 当前的问题是因为您从具有预定位置的矩形创建了世界和物理主体。这会导致您的 anchor 设置出现问题(创建世界和物理主体时,其左下角从场景的 anchor 开始)。
可以通过创建世界和玩家而不使用设置了位置的矩形来解决此问题。 SKShapeNode 的 shapeNodeWithRectOfSize
有效,SKSpriteNode 的 spriteNodeWithColor:size:
也是如此。 PhysicsBody 有点棘手,应该使用 bodyWithEdgeLoopFromPath: world.path
编辑:对于 future 有兴趣创建一款相机始终聚焦于玩家的横向卷轴游戏的人来说,这可能是最简单的工作方法:
var player = SKShapeNode()
var world = SKShapeNode()
override func didMoveToView(view: SKView) {
self.anchorPoint = CGPointMake(0.5, 0.5)
self.size = CGSizeMake(view.bounds.size.width, view.bounds.size.height)
// Add world
world = SKShapeNode(rectOfSize: CGSizeMake(300, 300))
world.physicsBody = SKPhysicsBody(edgeLoopFromPath: world.path)
world.fillColor = SKColor.blackColor()
self.addChild(world)
// Add player
player = SKShapeNode(rectOfSize: CGSize(width: 50, height: 50))
player.physicsBody = SKPhysicsBody(rectangleOfSize: CGSize(width: 50, height: 50))
player.fillColor = SKColor.blackColor()
world.addChild(player)
}
override func update(currentTime: CFTimeInterval) {
world.position.x = -player.position.x
world.position.y = -player.position.y
}
关于ios - 在玩家节点上定义 map 边界和中心?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24748247/