如何使子节点跟随Swift 4.2 SpriteKit中的父节点

时间:2018-12-26 23:04:49

标签: swift xcode sprite-kit

我要使其子精灵跟随其相应的父精灵。子级精灵具有一个物理实体,该实体不应与父级的物理实体混淆。我试图在父子对象的子类中重写这些功能,如下所示:

file.py --word 'Hello world!'

但是没有成功:(
我专门用SKActions移动父级精灵。 结果是这些精灵不会粘在一起。

public override func run(_ action: SKAction) {
    super.run(action)
    physicsSprite.run(action)
}
public override func run(_ action: SKAction, withKey key: String) {
    super.run(action, withKey: key)
    physicsSprite.run(action, withKey: key)
}
public override func removeAllActions() {
    super.removeAllActions()
    physicsSprite.removeAllActions()
}

在这种情况下,physicsSprite是SKSpriteNode子类中的childNode。预先感谢

3 个答案:

答案 0 :(得分:0)

很多方法可以做到这一点。定期比较节点(领导者/跟随者)的位置并相应地更新位置。示例:领导者转到某些位置>位置不匹配>将跟随者移动到领导者的位置。

代码示例

class GameScene: SKScene {
    private var leader: SKSpriteNode!
    private var follower: SKSpriteNode!

    override func didMove(to view: SKView) {
        self.leader = SKSpriteNode(color: UIColor.red, size: CGSize(width: 30, height: 30))
        self.follower = SKSpriteNode(color: UIColor.green, size: CGSize(width: 30, height: 30))
        self.addChild(leader)
        self.addChild(follower)
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        for t in touches {
            let target = t.location(in: self)
            // Move the leader to the touch location
            leader.run(SKAction.move(to: target, duration: 1), withKey: "moving")
        }
    }

    override func update(_ currentTime: TimeInterval) {
        // Check positions
        if follower.position != leader.position {
            // Check if the follower has a 'following' action already
            if follower.action(forKey: "following") == nil {
                // Move the follower
                follower.run(SKAction.move(to: leader.position, duration: 1), withKey: "following")
            }
        }
    }
}

请注意,每帧调用一次更新操作,这可能太多了。根据您的情况,您可以创建一种每秒调用一次的循环。

另一种方法是始终在下一个节点上运行相同的操作(持续时间较长,这样您就可以实际看到下一个节点)。

编辑: 有关冲突的更多信息:Can't understand how collision bit mask works(只需确保它们具有不同的接触位掩码-即0b01和0b10且彼此之间没有冲突位掩码)

答案 1 :(得分:0)

您可以尝试使用SKConstraint对象,该对象描述了对节点位置或方向的数学约束。

从文档中

将一个节点保持在另一个节点或场景中某个点的指定距离内。

请参见https://developer.apple.com/documentation/spritekit/skconstraint

答案 2 :(得分:-1)

尝试一下:

<div class="reviewwrapper">
  text
  <div id="reviewhover1">
    text
  </div>
</div>
<div class="reviewwrapper">
  text
  <div id="reviewhover2" style="background: red;">
    text
  </div>
</div>
<div class="reviewwrapper">
  text
  <div id="reviewhover3" style="background: blue;">
    text
  </div>
</div>
<div class="reviewwrapper">
  text
  <div id="reviewhover4" style="background: pink;">
    text
  </div>
</div>

有关更多信息,请检查documentation