Хобрук: Ваш путь к мастерству в программировании

Удаление коллизии SKSpriteNode при удалении неправильного с помощью Xcode Swift SpriteKit

Я делаю игру, в которой, когда персонаж приземляется на облако, облако исчезает. Я вставил код, чтобы определить, когда он попал, есть несколько облаков, зарегистрированных под одним и тем же SKSpriteNode, но когда он попадает в облако, неправильное облако исчезает, удаляется последний добавленный SKSpriteNode, а не тот, с которым он сталкивается.

Есть ли способ сделать это, чтобы он удалял только тот, с которым столкнулся персонаж, а не самый ранний из появившихся? Вот код:

func didBeginContact(contact: SKPhysicsContact)
{



    let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask

    switch(contactMask)
    {





    case BodyType.PersonCategory.rawValue | BodyType.CloudCategory.rawValue:

        let CheckDelay = delay(0.02)
            {

                    self.Cloud.runAction(self.FadeAway)

        }

    default:
        return





Person.physicsBody?.usesPreciseCollisionDetection = true
Person.size = CGSizeMake(self.frame.size.width / 25, self.frame.size.height / 16.25)
Person.physicsBody = SKPhysicsBody(rectangleOfSize: Person.size)
Person.physicsBody?.restitution = 0
Person.physicsBody?.friction = 0
Person.physicsBody?.allowsRotation = false
Person.physicsBody?.affectedByGravity = true
Person.physicsBody?.dynamic = true
Person.physicsBody?.linearDamping = 0
Person.zPosition = 5
Person.physicsBody?.categoryBitMask = BodyType.PersonCategory.rawValue
Person.physicsBody?.contactTestBitMask = BodyType.CloudCategory.rawValue
Person.position = CGPoint(x: CGRectGetMidX(self.frame), y: CGRectGetMidY(self.frame) * 1.7)
self.addChild(Person)


Cloud = SKSpriteNode(texture: NormalCloudTexture)
Cloud.zPosition = 7
Cloud.physicsBody?.usesPreciseCollisionDetection = true
Cloud.physicsBody?.affectedByGravity = false
Cloud.physicsBody?.allowsRotation = false
Cloud.size = CGSizeMake(self.frame.size.width / 8.05, self.frame.size.height / 40)
Cloud.physicsBody = SKPhysicsBody(rectangleOfSize: Cloud.size)
Cloud.physicsBody?.friction = 0
Cloud.physicsBody?.restitution = 0
Cloud.physicsBody?.dynamic = false
Cloud.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame) / 7.60)
addChild(Cloud)
25.04.2015

Ответы:


1

Вам нужно удалить облако, представленное физическим телом, которое фактически осуществляет контакт. поэтому bodyA — это либо игрок, либо облако, а затем bodyB — либо игрок, либо облако. Затем получите фактический SKSpriteNode из тела физики. На него можно ссылаться через свойство узла в теле SKPhysics. Итак, либо bodyA.node, либо bodyB.node.

25.04.2015
  • как бы я поступил об этом, я не был так уверен. Это код, который я использую, когда объявляю персонажа и облако для их физического тела. 25.04.2015
  • Облако = SKSpriteNode(текстура: NormalCloudTexture) Cloud.zPosition = 7 Cloud.physicsBody?.affectedByGravity = false Cloud.physicsBody?.allowsRotation = false Cloud.size = CGSizeMake(self.frame.size.width / 8.05, self.frame.size .height / 40) Cloud.physicsBody = SKPhysicsBody(rectangleOfSize: Cloud.size) Cloud.physicsBody?.friction = 0 Cloud.physicsBody?.dynamic = false Cloud.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self. кадр) / 7.60) addChild(Облако) 25.04.2015
  • Я поместил код в вопрос, так как он не помещался здесь, если вы можете его посмотреть. 25.04.2015
  • Я не совсем понимаю, что у вас там наверху, вы назвали свои инстансы с помощью Caps? Вы говорите, что у вас есть несколько облаков, но вы просто продолжаете назначать новые облака одному и тому же указателю облака? 25.04.2015
  • Да, я назвал свои инстансы заглавными буквами, нужно ли их удалить? И да, у меня есть несколько облаков, которые я назначаю одному и тому же указателю облака, это не годится? Должен ли я получить несколько разных вместо этого? 25.04.2015
  • Похоже, вы можете быть смущены тем, как работают ссылки и указатели. Когда вы создаете десять облаков подряд, присваивая каждому из них одну и ту же переменную, т. е. облако, тогда только последнее созданное вами облако будет ссылаться на переменную облако. Вам просто нужно следовать моим инструкциям, чтобы вытащить правильный узел облака из физических тел. 27.04.2015
  • Новые материалы

    Структуры данных в C ++ - Часть 1
    Реализация общих структур данных в C ++ C ++ - это расширение языка программирования C, которое поддерживает создание классов, поэтому оно известно как C с классами . Он используется для..

    Как я опубликовал свое первое приложение в App Store в 13 лет
    Как все началось Все началось три года назад летом после моего четвертого класса в начальной школе. Для меня, четвертого класса, лето кажется бесконечным, пока оно не закончится, и мой отец..

    Что в лицо
    Очерк о возвращении физиогномики и о том, почему мы должны это приветствовать. История начинается со странной науки. Р. Тора Бьорнсдоттир, Николас О. Рул. Видимость социального класса по..

    Почему шаблоны проектирования и почему нет?
    Сложность — мать всех проблем в программировании. Программное обеспечение должно быть разработано с точки зрения того, кто его поддерживает, а не того, кто его пишет, потому что программное..

    Создание дизайна обуви с помощью машинного обучения
    Обувь. Что подождать? Я думал, что речь пойдет о машинном обучении! Ну это так. Если бы вы пошли на Amazon, сколько обуви вы бы нашли? Наверное, много, не так ли? Но много ли в них..

    GraalVM в 2022 году: итоги года
    2022 год был очень продуктивным для проекта и сообщества GraalVM. Вместе мы разработали множество новых функций, выпустили GraalVM для последних версий Java и новых платформ и увидели несколько..

    Быстрая разработка: волшебный мир больших языковых моделей
    РУКОВОДСТВО Быстрая разработка: волшебный мир больших языковых моделей Подход, основанный на данных, для получения наилучшего ответа Искусство и наука Можно ли совместить машинное..