【问题标题】:SKSpriteNode collision not being recognized fast enoughSKSpriteNode 冲突没有被足够快地识别
【发布时间】:2015-10-28 15:05:56
【问题描述】:

我有一个 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)您使用的相关物理机构的精度是多少?在计算问题的情况下,我已经成功地修补了它。 2) 相关机构有什么形状?这是一个可怕的组合,但您可以使用半径或多边形尺寸比基础对象更大的物理体来更快地发生碰撞。
  • 球是圆形,障碍物是矩形。在这种情况下,增大半径或多边形尺寸并不是一个好主意,因为施加在球上的脉冲强度会有所不同
  • Pleasant 很可能是正确的,只需在一个或两个物理节点上设置 usesPreciseCollisionDetection: true 即可。
  • 您是否启用了视觉物理表示?物理体尺寸是否一切正常?对于启用了 collisionBitMask 的情况,一个想法是尝试使用两个物理体的恢复属性。该属性调节弹性。尝试设置一些较低的值,甚至 0 来看看会发生什么。好的,晚安,祝你的游戏好运 ;)
  • 设置恢复属性是个好主意。如果这不起作用,请尝试检查 SKPhysicsContact 对象。它有联系的地方。您可以使用它在球击中障碍物后重新定位。

标签: swift sprite-kit collision skspritenode skphysicsbody


【解决方案1】:

一些想法...

  1. 正如 CH Buckingham 评论的那样,将物理主体的 usesPreciseCollisionDetection 设置为 true 以用于快速移动的精灵是个好主意。从文档中,

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

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

此属性用于确定物理体有多少能量 当它从另一个物体反弹时丢失。该属性必须是一个值 在 0.0 和 1.0 之间。默认值为 0.2。

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

... 两个物理体之间的点 [发生撞击的地方],在 场景坐标

也可以使用collisionImpulse属性来判断

[t]指定这两个物体相互撞击的力度的冲动 以牛顿秒为单位。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-26
    • 2017-08-23
    • 2011-07-31
    • 1970-01-01
    相关资源
    最近更新 更多