2015-03-17 4 views
0

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

Проблема возникает при обнаружении столкновения между пулей и золотым астероидом. Когда между игроком и нормальным астероидом обнаружено столкновение, все хорошо, и вы проигрываете. Но когда обнаруживается столкновение между пулей и золотым астероидом, я получаю ошибку 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]; 
} 
} 

код, который работает, когда «[собственного игрока: (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]]]; 
} 

Это код, который работает, когда "[самостоятельная пуля: (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]; 
} 

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

+0

Где он точно падает? Печатает ли он 2-й «Хит» в журнале? Действительно ли это попадает в пулю: метод didCollideWithGoldAsteriod? Вы бросаете в SKSpriteNode много, что обычно является признаком того, что вы пытаетесь принудительно бросать объекты. Кроме того, почему в этом методе не используется пуля? Вместо этого вы используете self.bullet. Обычно, когда я получаю сообщения sigabrt, это происходит потому, что я пытаюсь запустить задержанный SKAction на узле, который уже удален из родителя и собранного мусора. –

+0

Что говорит сообщение об ошибке? Установили ли вы точку прерывания исключения? – sangony

+0

@PaddyCollins Это не печатало «хит» в журнале, но пока я просматривал там, я видел, что была проблема с звуковым эффектом. Я заменил его, и теперь он работает. Я использовал self.bullet, потому что я использую его как переменную класса. Я не знаю, что случилось с звуковым эффектом, но так как я его заменил, он больше не падает, и не сигабрт. – JustMe

ответ

0

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

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