Я тестирую особенности SpriteKit, и у меня возникла проблема. Я читал бит-маски, столкновение, категорию и контакт. Я получаю то, что они есть, по большей части, по крайней мере, я не понимаю точку битмакса, но у меня возникают встречные битмаски, которые мне нужны для решения моей проблемы.
Итак, моя проблема в том, что у меня есть два разных типа спрайтов: объект и второй. Названия на самом деле не имеют большого смысла, но это просто для тестирования. Я хочу, чтобы у второго был импульс, и я хочу, чтобы объект имел силу. Я смог применить соответствующие векторы на спрайтах, но я не хочу, чтобы они сталкивались друг с другом. Я хочу, чтобы они прошли прямо и проигнорировали существование друг друга.
Я попытался решить эту проблему, назначив разные битмаски для столкновений друг другу:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    let texture = SKTexture(imageNamed: "pokeball")
    let object = SKSpriteNode(texture: texture)
    object.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: object.size.width,height: object.size.height))
    object.physicsBody?.affectedByGravity = false
    object.yScale = 0.5
    object.xScale = 0.5
    for t in touches {
        object.position = t.location(in: self)
    }
    self.addChild(object)
    object.physicsBody?.collisionBitMask = UInt32(4)
    object.physicsBody?.applyForce(CGVector(dx: 0, dy: 10))
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    let texture = SKTexture(imageNamed: "purple")
    let second = SKSpriteNode(texture: texture)
    let impulse : Double = 20
    let x = (impulse * Double(cosf(45)))
    let y = Double(impulse * Double(sinf(45)))
    let vector = CGVector(dx: x, dy: y)
    second.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: second.size.width,height: second.size.height))
    second.yScale = 1.5
    second.xScale = 1.5
    second.physicsBody?.isDynamic = true
    for t in touches {
        second.position = t.location(in: self)
    }
    self.addChild(second)
    second.physicsBody?.collisionBitMask = UInt32(1)
    second.physicsBody?.applyImpulse(vector)
}
Итак, у объекта есть битовая маска 4:
object.physicsBody?.collisionBitMask = UInt32(4)
И вторая имеет битовую маску 1:
second.physicsBody?.collisionBitMask = UInt32(1)
Я запустил симулятор, и они все еще сталкиваются друг с другом, поэтому я пошел в Интернет и попытался найти ответы на некоторые вопросы: я нашел тот, который говорит, что я должен использовать такие числа, как:
это битмаски, вы не можете использовать произвольные числа 1,2,3,4,5 - вы должны использовать 1,2,4,8,16 и так далее -
Может кто-нибудь объяснить, почему? Однако это не было проблемой, потому что я использовал 1 и 4
Следующий вопрос, с которым я столкнулся, сказал, что мне пришлось использовать двоичные числа (0100) и (0010), я попробовал их, одну и ту же проблему: все еще сталкиваюсь.
Я оставлю изображение столкновений: Коллизии
Кто-нибудь знает, почему это происходит? Мои извинения заранее, если это действительно глупая ошибка или что-то, что уже было задано, я просто не мог ее найти.
