我有一个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)
}
}
理论上我可以计算球应该与障碍物碰撞的点,然后在碰撞后将球移动到该点,但是所有大部分障碍物都在积极移动,这将是非常困难的。有人有解决方案吗?提前致谢(:
答案 0 :(得分:3)
一些想法......
usesPreciseCollisionDetection
到true
是个好主意。来自文档,如果在任一主体上将此属性设置为YES,则模拟会执行更精确且更昂贵的计算来检测这些冲突。在小而快速移动的物体上,此属性应设置为YES。
restitution
属性会影响碰撞的弹性。将此设置为零将阻止球从障碍物上弹回来此属性用于确定物理体的能量 当它从另一个物体反弹时失去。该物业必须是一个价值 介于0.0和1.0之间。默认值为0.2。
collisionBitMask = 0
将导致球穿过障碍物而不是从它们反弹contactPoint
对象的SKPhysicsContact
属性重新定位球,其中contactPoint
是...两个物理机构[发生冲击的地方]之间的点,in 场景坐标
您还可以使用collisionImpulse
属性来确定
他的冲动指明了这两个身体相互之间的攻击力度 在牛顿秒。
以及给出碰撞方向的normalVector
属性。