Физические тела не реагируют на настройки битовой маски

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

-(void) createPlayer{
    player = [SKSpriteNode spriteNodeWithImageNamed:@"GonGonRed"];
    player.position = CGPointMake(40, 100);
    player.size = CGSizeMake(35*self.frame.size.height/320, 35*self.frame.size.height/320);
    player.zPosition = 7;    
    player.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:player.size.width/2-1];
    player.physicsBody.dynamic = NO;
    player.physicsBody.allowsRotation = NO;
    player.physicsBody.usesPreciseCollisionDetection = YES;
    player.physicsBody.categoryBitMask = 1;
    player.physicsBody.contactTestBitMask = 4;
    player.physicsBody.collisionBitMask = 2;
    player.physicsBody.mass = 0.013963;
    [self addChild:player];
}


SKSpriteNode *wheel = [SKSpriteNode spriteNodeWithImageNamed:@"wheel"];
wheel.size = CGSizeMake(newwidth, newheight);
wheel.position = CGPointMake(px, py);
wheel.name = @"wheel";    
wheel.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:newwidth/2];
wheel.physicsBody.dynamic = NO;
wheel.physicsBody.restitution = obstacleRestitution;
wheel.physicsBody.usesPreciseCollisionDetection = YES;
wheel.physicsBody.categoryBitMask = 3;
wheel.physicsBody.collisionBitMask = 0;
wheel.physicsBody.contactTestBitMask = 0;
wheel.zPosition = 5;

Колесо и игрок не должны сталкиваться, но они есть. я


person maxhud    schedule 02.02.2014    source источник


Ответы (1)


Это вызвано строкой ниже.

wheel.physicsBody.categoryBitMask = 3;

Набор SpriteKit сравнивает битовую маску категории тела с битовой маской столкновения другого тела, выполняя логическую операцию И. Когда результатом является ненулевое значение, происходит столкновение.

В этом случае SpriteKit сравнивает битовую маску категории колеса с битовой маской столкновения игрока, как показано ниже.

Битовая маска категории колеса равна 0x011 (= 3)
Битовая маска столкновения игрока равна 0x010 (= 2)
Результат операции И равен 0x010. Это не ноль, поэтому произошло столкновение.

Поэтому вам следует изменить значение categoryBitMask колеса, чтобы избежать того, чтобы результат логической операции И стал ненулевым, как показано ниже.

wheel.physicsBody.categoryBitMask = 8;

Кроме того, динамическое свойство должно быть установлено в YES.

person kykomi    schedule 02.02.2014
comment
Предполагается, что CategoryBitMasks представляет собой Uint32 с установленным только 1 (или 0) битом (битами), что означает, что их значение будет 0, 1, 2, 4, 8, 16, 32, 64 и т. д. и т. д. Любое другое значение (например, 3) фактически означает, что physicsBody находится в двух категориях одновременно (что может быть допустимо в некоторых сценариях). - person Steve Ives; 16.04.2016
comment
Если у вас есть проблема с коллизиями/контактами, которые не работают должным образом, попробуйте добавить func checkPhysics() из этого ответа iOS SpriteKit — коллизии и контакты не работают должным образом, а затем вызовите checkPhysics(), как только вы настроите все, как вы думаете. должно быть (может быть, в конце didMoveToView?) и посмотрите, соответствуют ли распечатанные результаты тому, что вы ожидаете - person Steve Ives; 16.04.2016