在精灵进入另一个精灵之前检查接触

时间:2017-02-02 15:33:07

标签: swift sprite-kit

我正在检查精灵何时接触另一个精灵,它将停止移动。所以我几乎为主要玩家创造了障碍:

enter image description here

当联系代表被触发时,我将玩家的速度设置为0,并且当它到达障碍时它完美地停止移动。但是,如果玩家击中障碍物,它会略微进入节点:

enter image description here

因此,如果它向左或向右,它将与另一侧的两个障碍物再次“接触”。它应该能够自由地左右移动,即使它正在触及障碍物。但是,由于主要玩家在屏障“内部”,它会触发不必要的联系。我认为解决方案是在播放器进入其他精灵节点之前检查联系人,我该如何检查?

修改

我发现创造障碍的最佳方法是简单地允许碰撞发生并使障碍块具有很大的质量。我可以分配给SKSpriteNode的最大CGFloat是什么?

修改

即使在将质量设定为大量之后,它们仍然会陷入困境。

修改

我非常喜欢使用SKConstraints的建议,我试过这样做:

    var constraints = [SKConstraint]()

    constraints.append(SKConstraint.distance(SKRange(lowerLimit: 10),
                                                 to: ent[0]))
    constraints.append(SKConstraint.distance(SKRange(lowerLimit: 10),
                                             to: ent[1]))
    constraints.append(SKConstraint.distance(SKRange(lowerLimit: 10),
                                             to: ent[2]))


    mainPlayer.constraints = constraints

然而,mainPlayer正好穿过这些块。这些块不是静态的,但由于它们不会发生碰撞,因此它会直接通过它们。我做错了什么?

1 个答案:

答案 0 :(得分:0)

我建议在播放器(或方框)中添加SKConstraint,这样在模拟物理后,你的角色始终距离盒子至少1个像素(所以不要触发另一个速度= 0)。

由于约束是在spritekit中的物理后处理的,所以应该工作得相当好:

enter image description here

这样的事情应该有效:

 let boxes: [SKNode] = [leftBox, middleBox, rightBox]
 var constraints = [SKConstraint]()
 for box in boxes {
      constraints.append(SKConstraint.distance(SKRange(lowerLimit: 5),
                                               to: box)
 }

player.constraints = constraints

SKConstraint documentation

注意:您可能需要调整约束中lowerLimit的距离以获得所需效果,或者为主播放器添加更多.distance个约束。比如,每个角落各占一个框。