【发布时间】: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