在SpriteKit中执行瞬时命中检测的有效方法是什么?使用SpriteKit的内置物理引擎我想在一个帧中收集受影响的对象,例如爆炸的爆炸半径。
我考虑过将SKNode与SKPhysicsBody一起添加到爆炸性对象并在爆炸时访问其allContactedBodies属性,但这会给其他帧添加不必要的碰撞检测。
我还考虑过将SKNode与SKPhysicsBody一起添加到场景中,或者在爆炸时更改现有的SKNode并在短时间内使用动作移除或恢复节点,但这会感觉不必要地复杂并且可能会延迟命中检测直到下一帧。
我想知道是否有一种方法可以扩展SKPhysicsWorld以允许枚举带有圆形的物体以及矩形 - 或者扩展SKPhysicsBody以允许与另一个测试体进行手动碰撞检测。 但是,我没有看到如何访问SKPhysicsBody的形状数据来执行其中任何一种。
答案 0 :(得分:0)
如果我要解决这个问题,我会通过创建一个带有物理主体的节点,然后搞乱它的动态,categoryBitMask和collisionBitMask属性来实现。我将动态设置为false,因为理论上碰撞/爆炸不会移动,因为它碰到了其他物体。我会设置它的categoryBitMask,以便每个对象在与它碰撞时生成“didBeginContact”报告。我会设置它的collisionBitMask,以便它不会因为碰撞而产生冲动。这样,physicsBody就更像是一个探测器,而不是一个真正的物理对象,只是它们的存在。
最后,物理机构应该引起碰撞报告,但不能排斥任何物体。很显然,你可以创建这个主体,并且只是在实际检测到事物的时候才将它添加到场景中。然后在那个框架结束后你知道它触及的所有物理实体你可以再次移除它。
然后我将场景设置为physicsContactDelegate,并实现完成开始接触方法。
class GameScene: Scene, SKPhysicsContactDelegate {
func didBeginContact(contact: SKPhysicsContact)
{
var AName:NSString = NSString(string: contact.bodyA.node!.name!)
var BName:NSString = NSString(string: contact.bodyB.node!.name!)
}
}
然后我将if语句检查AName或BName是否是“探测”节点/ physicBody的名称。然后,您可以添加代码,以便在碰撞时执行任何操作。
祝你好运!如果您遇到位掩码属性问题,我强烈建议您查看this。