Физика Телата не отговарят на настройките на битовата маска

Настройвам битовата маска на сблъсък върху физическо тяло, така че да не се сблъсква, но сблъсъци все още се случват.

-(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 сравнява categoryBitMask на тялото с collisionBitMask на другото тяло чрез извършване на логическа операция И. Когато резултатът е ненулева стойност, сблъсъкът се задейства.

В този случай SpriteKit сравнява категорията BitMask на колелото с битовата маска на сблъсък на играча, както е показано по-долу.

Категорията BitMask на колелото е 0x011 (= 3)
CollisionBitMask на играча е 0x010 (= 2)
Резултатът от операцията И е 0x010. Това е не-нула, така че сблъсъкът е възникнал.

Така че трябва да промените стойността на categoryBitMask на колелото, за да избегнете резултата от логическата операция И да стане различен от нула, както по-долу.

wheel.physicsBody.categoryBitMask = 8;

Освен това динамичното свойство трябва да бъде зададено на ДА.

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