ios - 在玩家节点上定义 map 边界和中心?

标签 ios swift sprite-kit

我正在使用 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/

相关文章:

ios - _BSMachError : (os/kern) invalid capability (20) & _BSMachError: (os/kern) invalid name (15)

ios - Swift - 同时设置角半径和阴影

iphone - UIScrollView 不会旋转到横向

swift - 更新 View 时处理单击和双击

ios - 多次调用函数时程序崩溃

ios - 测试游戏中心成就

来自服务器的 iOS tcp 套接字 json

ios - 从 iPhone 8 自动调整大小到 iPhone X 后,表格 View 在选项卡栏下调整大小

ios - 带自动布局的尺寸标签

ios - 如何使用 Swift 在 SpriteKit 程序中初始化/移动相机?