Я тестирую особенности 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), я попробовал их, одну и ту же проблему: все еще сталкиваюсь.
Я оставлю изображение столкновений: Коллизии
Кто-нибудь знает, почему это происходит? Мои извинения заранее, если это действительно глупая ошибка или что-то, что уже было задано, я просто не мог ее найти.