Код работает только на iOS 7

Привет, я делаю игру с фреймворком SpriteKit и устанавливаю битовую маску столкновения при столкновении двух объектов. Один из этих объектов, скажем, объект A, может иметь 2 состояния: черный или нормальный, поэтому, когда два объекта сталкиваются, а объект A находится в нормальном состоянии, он добавляет точку, но когда два объекта сталкиваются, а объект A черный. сказать, что игра окончена. Этот код отлично работает для меня на iOS 7, но когда я запускаю его на iOS 8, и если состояние объекта A черное, он действует так, как будто он находится в нормальном состоянии и добавляет точку. Почему это происходит? Отличается ли код для iOS 7 и 8? Помогите пожалуйста, вот код:

-(void)didBeginContact:(SKPhysicsContact *)contact {

SKPhysicsBody *firstBody;
SKPhysicsBody *secondBody;

if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask) {
    firstBody = contact.bodyA;
    secondBody = contact.bodyB;
}else {
    firstBody = contact.bodyB;
    secondBody = contact.bodyA;
}

   uint32_t collision = (contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask);

if (firstBody.categoryBitMask == objectACategory && secondBody.categoryBitMask == objectBCategory) {
    NSLog(@"OBJECT A CAUGHT");
    [firstBody.node removeFromParent];
    [GameState sharedInstance].score++;
    _scoreLabel.text = [NSString stringWithFormat:@"%d", [GameState sharedInstance].score];
    _scoreLabel_2.text = [NSString stringWithFormat:@"%d", [GameState sharedInstance].score];

    gameUrl = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"sound " ofType:@"wav"]];
    _gameSound = [[AVAudioPlayer alloc] initWithContentsOfURL:gameUrl error:nil];
    _gameSound.delegate = self;

    [_gameSound play];

    if ([[firstBody.node.userData valueForKey:@"Black"] boolValue]) {
        [self removeActionForKey:origamiFallKey];
        NSLog(@"YOU LOSE");
        [self gameOver];

        [self runAction:[SKAction sequence:@[
                                             [SKAction waitForDuration:0.5],
                                             [SKAction performSelector:@selector(removeWhenLose) onTarget:self]]]];

    }

}

Для установки состояния я использовал этот код в методе, который добавляет объектA:

  // Black
 if(arc4random_uniform(6) == 0) {
 _objectA.texture = [SKTexture textureWithImageNamed:@"blackImage.png"];
  _objectA.physicsBody.collisionBitMask = objectACategory;
 _objectA.userData = [[NSMutableDictionary alloc] init];
 [_objectA.userData setValue:@YES forKey:@"Black"];
 blackObjectA = YES;
 }

person Facundo Schiavoni    schedule 13.03.2015    source источник
comment
Интересно, переключение [_objectA.userData setValue:@YES forKey:@"Black"]; на [_objectA.userData setValue:@(YES) forKey:@"Black"]; решит вашу проблему и будет работать как на iOS7, так и на iOS8.   -  person Skyler Lauren    schedule 14.03.2015
comment
Нет, все равно не работает :/   -  person Facundo Schiavoni    schedule 14.03.2015
comment
Думаю, пора заняться творчеством. Я бы вышел из системы firstBody.node.userData прямо перед тем, как вы проверите Black и посмотрите, что там.   -  person Skyler Lauren    schedule 14.03.2015


Ответы (1)


Я наконец решил эту проблему. Сначала мне пришлось создать переменную collision:

uint32_t collision = (contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask);

И с записью коллизий, используя это:

-(void)didBeginContact:(SKPhysicsContact *)contact {

if (collision == (objectACategory | objectBCategory)) {
    if ([[firstBody.node.userData valueForKey:@"Black"] boolValue]){
        [self removeActionForKey:fallKey];
        NSLog(@"YOU LOSE");
        [self gameOver];

        [self runAction:[SKAction sequence:@[
                                             [SKAction waitForDuration:0.5],
                                             [SKAction performSelector:@selector(removeWhenLose) onTarget:self]]]];
    } else {

        [firstBody.node removeFromParent];
        [GameState sharedInstance].score++;
        _scoreLabel.text = [NSString stringWithFormat:@"%d", [GameState sharedInstance].score];
        _scoreLabel_2.text = [NSString stringWithFormat:@"%d", [GameState sharedInstance].score];

        gameUrl = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"origami " ofType:@"wav"]];
        _gameSound = [[AVAudioPlayer alloc] initWithContentsOfURL:gameUrl error:nil];
        _gameSound.delegate = self;

        [_gameSound play];

    }
}
person Facundo Schiavoni    schedule 18.03.2015