SKSpriteNode碰撞的识别速度不够快

时间:2015-08-05 17:40:21

标签: swift sprite-kit collision skspritenode skphysicsbody

我有一个SKSpriteNode(“称为球”),它通过对其物理实体施加冲动而启动。在我的didBeginContact方法中,我检查节点是否与障碍物碰撞。如果是这样,我希望SKSpriteNode立即停止移动(例如“粘住”它碰撞的对象)。问题是,当人们意识到球已经与障碍物碰撞并且球的速度被设置为0时,球已经反弹,而不是触碰它碰撞的障碍物,现在它是30左右的像素远

func didBeginContact(contact: SKPhysicsContact) {       
    ballInMidAir = false
    var firstBody : SKPhysicsBody = contact.bodyA
    var secondBody : SKPhysicsBody = contact.bodyB

    if (firstBody.categoryBitMask == PhysicsCatagory.Obstacle && secondBody.categoryBitMask == PhysicsCatagory.Ball){
        (secondBody.node as! SKSpriteNode).removeAllActions()
        secondBody.velocity = CGVectorMake(0, 0)
        (secondBody.node as! SKSpriteNode).runAction(SKAction.moveBy(obstacleVector, duration: 9.0))
    }
    else if (firstBody.categoryBitMask == PhysicsCatagory.ObstacleStill && secondBody.categoryBitMask == PhysicsCatagory.Ball){
        (secondBody.node as! SKSpriteNode).removeAllActions()
        secondBody.velocity = CGVectorMake(0, 0)
    }
}

理论上我可以计算球应该与障碍物碰撞的点,然后在碰撞后将球移动到该点,但是所有大部分障碍物都在积极移动,这将是非常困难的。有人有解决方案吗?提前致谢(:

1 个答案:

答案 0 :(得分:3)

一些想法......

  1. 正如CH Buckingham所评论的那样,为快速移动的精灵设置物理体usesPreciseCollisionDetectiontrue是个好主意。来自文档,
  2.   

    如果在任一主体上将此属性设置为YES,则模拟会执行更精确且更昂贵的计算来检测这些冲突。在小而快速移动的物体上,此属性应设置为YES。

    1. 正如Whirlwind指出的那样,设置restitution属性会影响碰撞的弹性。将此设置为零将阻止球从障碍物上弹回来
    2.   

      此属性用于确定物理体的能量   当它从另一个物体反弹时失去。该物业必须是一个价值   介于0.0和1.0之间。默认值为0.2。

      1. 在其中一个身体上设置collisionBitMask = 0将导致球穿过障碍物而不是从它们反弹
      2. 使用contactPoint对象的SKPhysicsContact属性重新定位球,其中contactPoint
      3.   

        ...两个物理机构[发生冲击的地方]之间的点,in   场景坐标

        您还可以使用collisionImpulse属性来确定

          他的冲动指明了这两个身体相互之间的攻击力度   在牛顿秒。

        以及给出碰撞方向的normalVector属性。