Я использую обнаружение столкновений в наборе спрайтов. Он работает и не позволяет моим спрайтам пересекать пути. Тем не менее, я не получаю уведомления в 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 на любой автомобиль?
Ответ на второй вопрос: свойство collisionBitMask имеет все биты, установленные по умолчанию, поэтому узел столкнется с каждым физическим блоком на сцене –
Кстати, какой размер Red Car.png? –
Спасибо. Оба изображения автомобиля - 52 х 94. – beev