Я получаю ошибку sigabrt при обнаружении определенного столкновения (iOS, SpriteKit)

В настоящее время я создаю приложение iOS в Objective-C. Идея приложения заключается в том, что у вас есть своего рода ракетный корабль, путешествующий через своего рода пояс астероидов. Играется в портретном режиме. Есть два разных вида астероидов. Обычные, которые заставляют вас проигрывать, когда вы врезаетесь в них, и золотые, в которые вы стреляете, чтобы получить монеты.

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

Код кода, который обнаруживает столкновение, следующий:

- (void)didBeginContact:(SKPhysicsContact *)contact
{
uint32_t collision = (contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask);

if (collision == (playerCategory | asteroidCategory))
{
    [self player:(SKSpriteNode *)self.player didCollideWithAsteroid:(SKSpriteNode *)self.asteroid];
}

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

if (collision2 == (bulletCategory | goldAsteroidCategory))
{
    [self bullet:(SKSpriteNode *)self.bullet didCollideWithGoldAsteroid:(SKSpriteNode *)self.goldAsteroid];
}
}

Код, который запускается, когда "[self player:(SKSpriteNode *)self.player didCollideWithAsteroid:(SKSpriteNode *)self.asteroid];" называется так:

- (void)player:(SKSpriteNode *)player didCollideWithAsteroid:(SKSpriteNode *)asteroid
{
[self runAction:[SKAction playSoundFileNamed:@"Explosion.mp3" waitForCompletion:NO]];


NSLog(@"Hit");
[self.player removeFromParent];
[self.asteroid removeFromParent];

SKAction *actionMoveDone = [SKAction removeFromParent];
SKAction * loseAction = [SKAction runBlock:^{
    SKTransition *reveal = [SKTransition crossFadeWithDuration:0.5];
    SKScene * gameOverScene = [[GameOverScene alloc] initWithSize:self.size won:NO];
    [self.view presentScene:gameOverScene transition: reveal];
}];

[self.asteroid runAction:[SKAction sequence:@[loseAction, actionMoveDone]]];
}

Это код, который запускается, когда "[self bullet:(SKSpriteNode *)self.bullet didCollideWithGoldAsteroid:(SKSpriteNode *)self.goldAsteroid];" называется:

- (void)bullet:(SKSpriteNode *)bullet didCollideWithGoldAsteroid:(SKSpriteNode *)goldAsteroid
{
[self runAction:[SKAction playSoundFileNamed:@"ding.m4a" waitForCompletion:NO]];
NSLog(@"Hit");
[self.bullet removeFromParent];
[self.goldAsteroid removeFromParent];
[self plusOneCoin];
}

Я считаю, что должно быть достаточно информации и кода, но не стесняйтесь спрашивать меня о большем, я опубликую то, что необходимо.


person JustMe    schedule 17.03.2015    source источник
comment
Где именно вылетает? Печатает ли он второе попадание в журнал? Действительно ли он попадает в метод bullet:didCollideWithGoldAsteriod? Вы много кастуете в SKSpriteNode, что обычно является признаком того, что вы пытаетесь принудительно приводить объекты. Кроме того, почему в этом методе не используется пуля? Вместо этого вы используете self.bullet. Обычно, когда я получаю сообщения sigabrt, это происходит потому, что я пытаюсь запустить отложенный SKAction на узле, который уже был удален из родительского узла и собран мусор.   -  person Patrick Collins    schedule 17.03.2015
comment
Что говорится в сообщении об ошибке? Вы установили точку останова для всех исключений?   -  person sangony    schedule 17.03.2015
comment
@PaddyCollins В журнале не было напечатано попадание, но пока я просматривал его, я увидел, что возникла проблема со звуковым эффектом для воспроизведения. Я заменил его, и теперь он работает. Я использовал self.bullet, потому что использую его как переменную класса. Не знаю, что было со звуковым эффектом, но с тех пор, как я его заменил, он больше не вылетает, и сигабрта нет.   -  person JustMe    schedule 17.03.2015
comment
@sangony Я заглянул в него, ища попадание в журнал, как предложил Пэдди, и увидел, что со звуковым эффектом возникла какая-то проблема. Я не уверен, что случилось, но я заменил его, и теперь он работает, и я могу перейти к исправлению других ошибок.   -  person JustMe    schedule 17.03.2015
comment
Это отлично. В качестве примечания: попробуйте не использовать файлы m4a со SpriteKit, так как это может вызвать проблемы. Файлы Wav или caf являются лучшим выбором.   -  person sangony    schedule 17.03.2015
comment
Скорее всего так и произошло, сейчас использую мп3 файл (wav не получилось, как хотел) и все работает. У вас есть идеи, почему SpriteKit не любит файлы m4a?   -  person JustMe    schedule 18.03.2015


Ответы (1)


Когда я посмотрел в логе, я увидел, что была проблема со звуковым эффектом "ding.m4a". Я заменил его другим звуком монеты, и теперь он работает. Я не совсем уверен, что случилось со звуком, но это была проблема.

person JustMe    schedule 17.03.2015