定义地图的边界并以玩家节点为中心?[英] Define map bounds and center on player node?

本文是小编为大家收集整理的关于定义地图的边界并以玩家节点为中心?的处理方法,想解了定义地图的边界并以玩家节点为中心?的问题怎么解决?定义地图的边界并以玩家节点为中心?问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我正在使用 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 文档中的示例在 高级场景处理部分.Apple 建议将"世界"SKNode 作为场景的子节点,将"相机"SKNode 作为世界的子节点.

他们建议在 didSimulatePhysics 步骤中不断移动世界,使其以相机为中心.如果您愿意,此方法允许您在相机本身上执行操作或模拟物理.如果在此步骤之前将相机居中,您将无法使用物理来影响相机节点.

如果您只想左右滚动,只需将移动限制在 X 轴上即可.

编辑:当前的问题是因为您从 Rect 中创建了世界和physicsBody,该 Rect 的位置已预先确定.这会导致您的 anchorPoint 设置出现问题(正在创建世界和物理实体,它们的左下角从场景的锚点开始).

这可以通过创建 World 和 Player 来解决,而不使用设置了位置的 Rect.SKShapeNode 的 shapeNodeWithRectOfSize 有效,SKSpriteNode 的 spriteNodeWithColor:size: PhysicsBody 有点棘手,应该使用 bodyWithEdgeLoopFromPath: world.path

编辑:对于未来有兴趣创建带有始终专注于播放器的相机的横向卷轴的人来说,这可能是最简单的工作方式:

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
}

本文地址:https://www.itbaoku.cn/post/924512.html