В настоящее время я создаю приложение 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];
}
Я считаю, что должно быть достаточно информации, и код, но не стесняйтесь спрашивать меня больше, я буду публиковать то, что необходимо.
Где он точно падает? Печатает ли он 2-й «Хит» в журнале? Действительно ли это попадает в пулю: метод didCollideWithGoldAsteriod? Вы бросаете в SKSpriteNode много, что обычно является признаком того, что вы пытаетесь принудительно бросать объекты. Кроме того, почему в этом методе не используется пуля? Вместо этого вы используете self.bullet. Обычно, когда я получаю сообщения sigabrt, это происходит потому, что я пытаюсь запустить задержанный SKAction на узле, который уже удален из родителя и собранного мусора. –
Что говорит сообщение об ошибке? Установили ли вы точку прерывания исключения? – sangony
@PaddyCollins Это не печатало «хит» в журнале, но пока я просматривал там, я видел, что была проблема с звуковым эффектом. Я заменил его, и теперь он работает. Я использовал self.bullet, потому что я использую его как переменную класса. Я не знаю, что случилось с звуковым эффектом, но так как я его заменил, он больше не падает, и не сигабрт. – JustMe