在SpriteKit中执行即时命中检测的有效方法是什么?使用SpriteKit内置的物理引擎,我想要在单个帧中收集受影响的对象,以了解爆炸的爆炸半径等情况。
我曾考虑过在爆炸性对象中添加一个带有SKPhysicsBody的SKNode,并在爆炸时访问其allContactedBodies属性,但这会给其他帧添加不必要的碰撞检测。
我也考虑过在爆炸时添加一个带有SKPhysicsBody的SKNode到场景中,或者更改现有的一个,并使用一个动作在短时间后移除或恢复节点,但这感觉不必要的复杂,可能会将命中检测延迟到下一帧。
我想知道是否有一种方法可以扩展SKPhysicsWorld以允许枚举除矩形之外的圆形主体-或者扩展SKPhysicsBody以允许手动检测与另一个测试主体的冲突。但是,我不知道如何访问SKPhysicsBody的形状数据来完成这两项操作。
发布于 2016-02-08 04:38:20
如果我要解决这个问题,我会创建一个具有物理主体的节点,然后处理它的dynamic、categoryBitMask和collisionBitMask属性。我会将dynamic设置为false,因为理论上碰撞/爆炸不会移动,因为它会击中其他对象。我会设置它的categoryBitMask,这样每个对象在与它碰撞时都会生成一个"didBeginContact“报告。我会设置它的collisionBitMask,这样它就不会因为碰撞而产生脉冲。这样的话,physicsBody更像是一个探测器,而不是一个实际的物理物体,只是他们的东西。
最后,物理体应该会产生碰撞报告,但不会排斥任何物体。显然,您可以创建此身体,只是在实际检测事物的时候才将其添加到场景中。然后,在这个框架结束之后,你知道它接触的所有物理体,你可以再次移除它。
然后,我会将场景设置为physicsContactDelegate并实现did begin contact方法。
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是否是“探测”节点/物理主体的名称。然后,你可以添加代码来做任何你想做的事情,这是冲突的结果。
祝好运!如果您在比特掩码属性方面遇到问题,我强烈建议您查看this。
https://stackoverflow.com/questions/35256122
复制相似问题