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