使用SKSpriteNode平台移动SKSpriteNode角色

时间:2014-11-26 08:19:27

标签: swift sprite-kit

我正在构建一个平台游戏,其中有一个跳到移动平台上的SKSpriteNode角色。

当平台移动时,角色没有,它最终从平台上掉下来。如果我点击移动按钮,角色会很好地移动,但我希望角色在移动时“粘住”平台。

我没有发布代码,因为代码按预期工作。我觉得它可以设置一个属性吗?

编辑:

我有一个解决方案 - 只是不确定人们应该怎么做,所以我会在下面发帖并等待反馈。它既冗长又复杂,可能不需要。

当用户按下左或右方向按钮时,我通过以下方式从GameScene.swift移动场景:

    func moveGround(direction: String) {


    if direction == "left" {

        [snip...]
        // move the platforms
        self.enumerateChildNodesWithName("platform") {
            node, stop in

            if let foundNode = node as? PlatformSprite {
                node.position.x += Helper().kMovingDistance
            }

        }

        // move all other nodes
        self.enumerateChildNodesWithName("*") {
            node, stop in

            if let foundNode = node as? SKSpriteNode {
                node.position.x += Helper().kMovingDistance
            }

        }
        [snip...]

    } else if direction == "right" {

        [snip...]
        // move the platforms
        self.enumerateChildNodesWithName("platform") {
            node, stop in

            if let foundNode = node as? PlatformSprite {
                node.position.x -= Helper().kMovingDistance
            }

        }

        // move all other nodes
        self.enumerateChildNodesWithName("*") {
            node, stop in

            if let foundNode = node as? SKSpriteNode {
                node.position.x -= Helper().kMovingDistance
            }

        }
        [snip...]
    }

这可以很好地移动场景。然后当角色落在平台顶部时,我使用SKAction序列启动平台移动并通过向GameScene发送反向序列来启动场景移动:

    func startMoving() {

    if !self.isMoving {

        [snip...]

        // get the platform actions and initiate the movements
        let actions = self.getMovements()
        let seq:SKAction = SKAction.sequence(actions)

        // move the platform
        self.runAction(seq, completion: { () -> Void in
            self.completedPlatformActions()
        })

        // get the reverse actions and initiate then on the scene / ground
        let reverseActions = self.getReverseMovements()
        let reverseSeq:SKAction = SKAction.sequence(reverseActions)

        delegate!.moveGroundWithPlatform(reverseSeq)

        self.isMoving = true

    }
}

然后我有一个用平台移动地面的功能,并为runAction添加一个键,这样我就可以停止该操作,而不是平台动作,如果用户不再与平台联系:

   func moveGroundWithPlatform(seq: SKAction) {

    [snip...]

    self.enumerateChildNodesWithName("platform") {
        node, stop in

        if let foundNode = node as? PlatformSprite {
            node.runAction(seq, withKey: "groundSeq")
        }

    }
  [snip...]
  }

然后我停止移动场景,但让平台的剩余动作继续使用:

    func stopMovingGroundWithPlatform() {

    [snip...]
    self.enumerateChildNodesWithName("platform") {
        node, stop in

        if let foundNode = node as? PlatformSprite {
            node.removeActionForKey("groundSeq")
        }

    }
    [snip...]
}

丑陋我知道 - 如果其他人有关于如何更好地做到这一点的建议,我很想知道:)

1 个答案:

答案 0 :(得分:1)

如果你想让角色与平台一起移动,你需要用力,冲动或设定速度来移动平台。我怀疑通过设置速度来控制平台更容易。您可以通过

update方法中执行此操作
platform.physicsBody?.velocity = CGVectorMake(dx,dy)

其中dxdy分别控制x和y方向的平台速度。您还应该设置平台物理主体的摩擦属性。