Почему невозможно обнаружение столкновений на объекте? - PullRequest
0 голосов
/ 20 мая 2019

Есть ли конкретная причина, по которой Apple предпочла бы разрешать обнаружение столкновений только по всему миру, а не позволять отдельным объектам обнаруживать, когда они сталкиваются с другими вещами? Это кажется ужасным выбором дизайна, но так как я не нашел много жалоб, я предполагаю, что что-то упускаю. Итак, есть ли?

1 Ответ

0 голосов
/ 29 мая 2019

Некоторые отличные комментарии здесь и не уверен, почему тоже.Они основывают все это на узлах и именах узлов - кажется, что это может быть лучше, поскольку поиск вещей после того, как факт медленнее.Вот как я справился с этим, подобно тому, что говорят другие.

Поскольку у меня есть куча ракет, я просто называю узел = "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))!)
        }
    }

Я не делаю узлы подклассов, я создаю классы, такие как DefenseObject, с нужным мне материалом, затем создаю массив, который я могуПрямой доступ или цикл.

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

Тогда я могу перейти прямо к индексу и выполнить defenseObjects [NDex] .call ().Я также не пытаюсь очистить узлы во время волны, я устанавливаю переключатель isActive и скрываю их.В конце волны я убираю их.

Надеюсь, это поможет.

...