为什么不可能进行对象内碰撞检测?

时间:2019-05-20 15:04:53

标签: ios swift sprite-kit scenekit

Apple是否有特定的原因为什么会选择只允许在世界范围内进行碰撞检测,而不是允许单个对象在与其他物体发生碰撞时进行检测?这似乎是一个可怕的设计选择,但是由于我没有发现太多抱怨,所以我猜想我缺少了一些东西。那有吗?

1 个答案:

答案 0 :(得分:0)

这里有一些很棒的评论,也不确定为什么要这么做。他们将整个事情基于节点和节点的名称-似乎可以在事实较慢之后查找事物,这样会更好。这是我的处理方式,与其他人说的类似。

因为我有一堆导弹,所以我只将节点命名为“ Missi” +字符串(格式:“%04d”,vIndex),名称=“ Explo” +字符串(格式:“%04d”,vIndex)等等,这样我就可以为要查找的内容添加前缀,并直接进入节点数组并执行我的操作。我有成百上千的东西,但是碰撞功能很小。

func physicsWorld(_ world: SCNPhysicsWorld, didBegin contact: SCNPhysicsContact)
    {
        guard let nodeNameA = contact.nodeA.name else { return }
        guard let nodeNameB = contact.nodeB.name else { return }

        //print("CONTACT: \(nodeNameA) \(nodeNameB)")
        if(nodeNameA.prefix(5) == "Explo" && nodeNameB.prefix(5) == "Enemy")
        {
            gameControl.defenseMissileHit(vIndex: Int(nodeNameB.suffix(4))!)
        }
        if(nodeNameA.prefix(5) == "Enemy" && nodeNameB.prefix(5) == "Explo")
        {
            gameControl.defenseMissileHit(vIndex: Int(nodeNameA.suffix(4))!)
        }

        if(nodeNameA.prefix(5) == "Explo" && nodeNameB.prefix(5) == "Missi")
        {
            //print("HIT")
            gameControl.enemyMissileHit(vIndex: Int(nodeNameB.suffix(4))!)
        }
        if(nodeNameA.prefix(5) == "Missi" && nodeNameB.prefix(5) == "Explo")
        {
            //print("HIT")
            gameControl.enemyMissileHit(vIndex: Int(nodeNameA.suffix(4))!)
        }
    }

我不是子类的节点,我用所需的东西创建诸如DefenceObject之类的类,然后创建一个可以直接访问或循环通过的数组。

var defenseObjects:                     [Int:DefenseObject] = [:]    

class DefenseObject: ObjectBase
{
    var index: Int = 0                              // Index of object
    var name: String = ""                           // Object name
    var isActive: Bool = false                      // Object is active
    init(vGameType: gameTypes, vCount: Int, position: SCNVector3)
    {
        super.init(vGameType: vGameType, vIndex: vCount)
        isActive = true
        name = "Enemy" + String(format: "%04d", vIndex)
    }
}

然后我可以直接进入索引并执行defenceObjects [NDex] .call()。我也没有尝试在wave中清理节点,而是设置了isActive开关并将其隐藏。在浪潮结束时,我清理了它们。

希望有帮助。