繁体   English   中英

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

[英]Why it's impossible to do in-object collision detection?

是否有一个特殊的原因可以让Apple选择仅允许通过世界进行碰撞检测,而不是允许单个物体检测何时与其他物体发生碰撞? 这似乎是一个可怕的设计选择,但由于我没有发现太多抱怨,我猜我有些东西我不知道。 那么,有吗?

这里有一些很好的评论,也不确定为什么。 它们将整个事物建立在节点和节点名称上 - 看起来在事实变慢之后看起来更好。 以下是我处理它的方式,与其他人的说法类似。

由于我有一堆导弹,我只是命名为node =“Missi”+ String(格式:“%04d”,vIndex),name =“Explo”+ String(格式:“%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))!)
        }
    }

我没有子节点,我用我想要的东西创建防御对象等类,然后创建一个我可以直接访问或循环的数组。

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)
    }
}

然后我可以直接进入索引并执行防御对象[NDex] .call()。 我也不尝试在波浪期间清理节点,我设置了一个isActive开关并隐藏它们。 在浪潮结束时,我清理它们。

希望有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM