2013-11-28 1 views
1

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

У меня есть различные автомобили (SKSpriteNodes) движущиеся вокруг следующих путей с помощью SKAction followPath: asOffset: orientToPath: продолжительность:

Ранее, если два автомобиля пересекались они оба просто продолжать как обычно с одной вождения над другой , Для того, чтобы осуществить обнаружение столкновения я сделал следующие изменения ...

Добавлено это мой @interface:

<SKPhysicsContactDelegate> 

Добавлено это мой @implementation:

static const uint32_t carCategory = 0x1 << 0; 

Добавлено этом в моей инициализации метод:

self.physicsWorld.contactDelegate = self; 
self.physicsWorld.gravity = CGVectorMake(0.0, 0.0); 

Я создаю мой синий автомобиль:

- (void)addBlueCar 
{ 
    _blueCar = [SKSpriteNode spriteNodeWithImageNamed:@"Blue Car.png"]; 
    _blueCar.position = CGPointMake(818.0, -50.0); 
    _blueCar.name = @"car"; 
    [self addChild:_blueCar]; 

    CGSize contactSize = CGSizeMake(_blueCar.size.width - 5.0, _blueCar.size.height - 5.0); 
    _blueCar.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:contactSize]; 
    _blueCar.physicsBody.categoryBitMask = carCategory; 
    _blueCar.physicsBody.collisionBitMask = carCategory; 
    _blueCar.physicsBody.contactTestBitMask = carCategory; 
} 

И я также создать красный автомобиль:

- (void)addRedCar 
{ 
    _redCar = [SKSpriteNode spriteNodeWithImageNamed:@"Red Car.png"]; 
    _redCar = CGPointMake(818.0, -50.0); 
    _redCar = @"car"; 
    [self addChild: _redCar]; 

    CGSize contactSize = CGSizeMake(_blueCar.size.width - 5.0, _blueCar.size.height - 5.0); 
    _redCar.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:contactSize]; 
    _redCar.physicsBody.categoryBitMask = carCategory; 
    _redCar.physicsBody.collisionBitMask = carCategory; 
    _redCar.physicsBody.contactTestBitMask = carCategory; 
} 

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

Первая проблема заключается в том, что я не получаю никаких уведомлений. У меня это пока он не входит ничего на консоль:

- (void)didBeginContact:(SKPhysicsContact *)contact 
{ 
    NSLog(@"Contact"); 
} 

Вторая проблема заключается в том, что, когда два автомобиля пересекались они начинают подталкивать друг друга, конечно. Это нормально, но я, похоже, не в состоянии управлять любыми аспектами обработки столкновений. Странное дело, что ничего не меняется, когда я делаю это, чтобы оба моих методов создания автомобиля:

- (void)addBlueCar 
{ 
    _blueCar = [SKSpriteNode spriteNodeWithImageNamed:@"Blue Car.png"]; 
    _blueCar.position = CGPointMake(818.0, -50.0); 
    _blueCar.name = @"car"; 
    [self addChild:_blueCar]; 

    CGSize contactSize = CGSizeMake(_blueCar.size.width - 5.0, _blueCar.size.height - 5.0); 
    _blueCar.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:contactSize]; 
// _blueCar.physicsBody.categoryBitMask = carCategory; 
// _blueCar.physicsBody.collisionBitMask = carCategory; 
// _blueCar.physicsBody.contactTestBitMask = carCategory; 
} 

Обнаружение столкновений еще работает так же с этими тремя линиями закомментированными для обоих автомобилей. Мне это не кажется правильным. Обнаружение столкновений прекращается только тогда, когда я закомментировать эту строку:

_blueCar.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:contactSize]; 

Так что мой главный вопрос: почему ничего это не contactTest отчетности? Мой второй вопрос: почему обнаружение столкновения происходит, когда я не назначаю categoryBitMask, collisionBitMask или contactTestBitMask на любой автомобиль?

+0

Ответ на второй вопрос: свойство collisionBitMask имеет все биты, установленные по умолчанию, поэтому узел столкнется с каждым физическим блоком на сцене –

+0

Кстати, какой размер Red Car.png? –

+0

Спасибо. Оба изображения автомобиля - 52 х 94. – beev

ответ

5

collisionBitMask По умолчанию установлено значение 0xFFFFFFFF (все установленные биты). Поэтому узел столкнется с каждым physicBody на сцене.

+1

Спасибо. И мне просто нужно было изменить консоль, чтобы показать «весь вывод», чтобы увидеть, когда callBeinContact: вызывает вызов. – beev

+0

@beev Я не понимаю, что вы сделали, вы решили это? У меня есть все выходные данные для моей консоли – 4GetFullOf

+1

В моей консоли, в левом нижнем углу, я установил ее для вывода Debugger, и поэтому я не видел NSLogs, который я ожидал от своего кода. Когда я переключил его на All Output, я увидел то, что ожидал. Если у вас установлена ​​ваша сцена, как указано выше, вы должны получить «Контакт», зарегистрированный в консоли, когда вызывается callBeginContact, т. Е. Когда вы получаете столкновение. – beev

0

Просто небольшое наблюдение, возможно, вы должны настроить свои узлы и установить делегат-контакт в методе метода doneMoveToView.

Если это не решит проблему, вы можете отправить какой-либо рабочий код в github для отладки?

+0

Спасибо. Я попытался установить делегат в файле didMoveToView, но это не имело значения. – beev

0

Что-то, что помогло мне в этом: столкновение и контакты - это разные вещи.

Столкновение обрабатывается физическим движком и установка столкновенияBitMask будет определять, какие тела сталкиваются и взаимодействуют друг с другом в физическом мире. По умолчанию все ваши тела будут сталкиваться друг с другом, что имеет смысл.

Контакты - это события - когда органы свяжутся, будут ли они создавать уведомление, которое вы можете использовать в методе делегата, чтобы делать более интересные вещи. Если у вас есть мяч, который вы хотите поразить веслом, вы хотите, чтобы они столкнулись как минимум. Но если у вас есть шар, перемещающийся через облако, вы, вероятно, не хотите, чтобы они сталкивались в физическом мире, но вы можете захотеть зарегистрировать контакт.

 Смежные вопросы

  • Нет связанных вопросов^_^