Collision Bit Mask Hero проходит сквозь КАЖДУЮ вещь, даже Землю

Я пытаюсь избежать столкновений между героем и монетами, но не между героем и травой. Как только я применяю битовую маску столкновения к герою, мой герой проходит через КАЖДУЮ вещь. Я хочу, чтобы он проходил через монеты, но не сквозь траву. Вот код, есть идеи?

let HEROCATEGORY: UInt32 = 0x1 << 1;
let GROUNDCATEGORY: UInt32 = 0x1 << 2;
let FIRECATEGORY: UInt32 = 0x1 << 3;
let COINCATEGORY: UInt32 = 0x1 << 4;
let NUMBERCATEGORY: UInt32 = 0x1 << 5;

heroSprite.physicsBody!.categoryBitMask = HEROCATEGORY;
heroSprite.physicsBody!.collisionBitMask = 0x10000000;
heroSprite.physicsBody!.contactTestBitMask = GROUNDCATEGORY | FIRECATEGORY | COINCATEGORY | NUMBERCATEGORY;

grassGround.physicsBody!.categoryBitMask = GROUNDCATEGORY;
grassGround.physicsBody!.collisionBitMask = 0x01000000;

coinSprite.physicsBody!.categoryBitMask = COINCATEGORY;
coinSprite.physicsBody!.contactTestBitMask = HEROCATEGORY;
coinSprite.physicsBody!.collisionBitMask = 0x10000000;

1 ответ

Решение

Если герой должен обнаружить столкновение только с землей, то битовая маска героя должна быть

heroSprite.physicsBody?.collisionBitMask = GROUNDCATEGORY

Чтобы обнаружить столкновение с землей и что-то еще, вы должны использовать ИЛИ | оператор объединить оба categoryBitMasks

 heroSprite.physicsBody?.collisionBitMask = GROUNDCATEGORY | SOMETHINGCATEGORY

contactTestBitMask используется для обратного вызова при контакте между двумя телами. Мы получаем обратный вызов, когда оба объекта занимают одно и то же пространство. Это не обрабатывает столкновения.

Я думаю, что вам нужно обнаружение контакта с огнем и монетами и обнаружение столкновения с землей. Так что просто установите битовую маску столкновения heroSprite в GROUNDCATEGORY как в моем первом фрагменте кода.

let HEROCATEGORY: UInt32 = 0x1 << 1
let GROUNDCATEGORY: UInt32 = 0x1 << 2
let FIRECATEGORY: UInt32 = 0x1 << 3
let COINCATEGORY: UInt32 = 0x1 << 4
let NUMBERCATEGORY: UInt32 = 0x1 << 5

heroSprite.physicsBody!.categoryBitMask = HEROCATEGORY
heroSprite.physicsBody!.collisionBitMask = GROUNDCATEGORY // changed
heroSprite.physicsBody!.contactTestBitMask = GROUNDCATEGORY | FIRECATEGORY | COINCATEGORY | NUMBERCATEGORY

grassGround.physicsBody!.categoryBitMask = GROUNDCATEGORY
grassGround.physicsBody!.collisionBitMask = HEROCATEGORY

coinSprite.physicsBody!.categoryBitMask = COINCATEGORY
coinSprite.physicsBody!.contactTestBitMask = HEROCATEGORY
Другие вопросы по тегам