结束游戏不工作

时间:2014-11-16 17:45:52

标签: ios objective-c sprite-kit

我正在使用教程来创建一个游戏,如果火箭飞船被小行星击中,该船将使用SKEmitterNode显示图像并闪烁然后播放声音。这部分游戏正在运作,但游戏不会结束。如何解决此错误?

这是我的代码,我认为错误是

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

    if (collision == (asteroidCategory | shipCategory)) {
        SKNode *asteroid, *spaceship;

        if (contact.bodyA.categoryBitMask == shipCategory) {
            spaceship = contact.bodyA.node;
            asteroid = contact.bodyB.node;
            [self runAction:[SKAction playSoundFileNamed:@"explosion_large.caf" waitForCompletion:NO]];

            SKAction *blink = [SKAction sequence:@[[SKAction fadeOutWithDuration:0.1],
                                                   [SKAction fadeInWithDuration:0.1]]];
            SKAction *blinkForTime = [SKAction repeatAction:blink count:6];
            [self.spaceship runAction:blinkForTime];

            NSString *explosionPath = [[NSBundle mainBundle] pathForResource:@"RocketFlame" ofType:@"sks"];
            SKEmitterNode *explosion = [NSKeyedUnarchiver unarchiveObjectWithFile:explosionPath];
            CGVector emitterVector = CGVectorMake(spaceship.frame.size.width * 2.0, 0);
            explosion.particlePositionRange = emitterVector;
            [self.spaceship addChild:explosion];
        }
        else {
            spaceship = contact.bodyB.node;
            asteroid = contact.bodyA.node;
            [self runAction:[SKAction playSoundFileNamed:@"explosion_large.caf" waitForCompletion:NO]];

            SKAction *blink = [SKAction sequence:@[[SKAction fadeOutWithDuration:0.1],
                                                   [SKAction fadeInWithDuration:0.1]]];
            // SKAction *blinkForTime = [SKAction repeatAction:blink count:6];
            [self.spaceship runAction:blink];

            NSString *explosionPath = [[NSBundle mainBundle] pathForResource:@"RocketFlame" ofType:@"sks"];
            SKEmitterNode *explosion = [NSKeyedUnarchiver unarchiveObjectWithFile:explosionPath];
            CGVector emitterVector = CGVectorMake(spaceship.frame.size.width * 2.0, 0);
            explosion.particlePositionRange = emitterVector;
            [self.spaceship addChild:explosion];

        }

        [self asteroid:(SKSpriteNode *) asteroid didCollideWithasteroid:(SKSpriteNode *) spaceship];
    }
    else if (collision == (projectileCategory| asteroidCategory)) {

        SKNode *Projectile, *asteroid;

        if (contact.bodyA.categoryBitMask == asteroidCategory) {
            Projectile= contact.bodyA.node;
            asteroid = contact.bodyB.node;
        }
        else {
            Projectile = contact.bodyB.node;
            asteroid = contact.bodyA.node;
        }

        [self projectile:(SKSpriteNode *) Projectile didCollideWithasteroid:(SKSpriteNode *) asteroid];

        self.asteroidsDestroyed++;
        if (self.asteroidsDestroyed > 30) {
            SKTransition *reveal = [SKTransition flipHorizontalWithDuration:0.5];
            SKScene * gameOverScene = [[GameOverScene alloc] initWithSize:self.size won:NO];
            [self.view presentScene:gameOverScene transition: reveal];
        }
    }
}

1 个答案:

答案 0 :(得分:0)

游戏没有结束,因为你并没有像飞船和小行星之间发生碰撞那样在宇宙飞船和小行星之间进行结束时调用终点游戏过渡。

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

    if (collision == (asteroidCategory | shipCategory)) {
        SKNode *asteroid, *spaceship;

        if (contact.bodyA.categoryBitMask == shipCategory) {
            spaceship = contact.bodyA.node;
            asteroid = contact.bodyB.node;

        }
        else {
            spaceship = contact.bodyB.node;
            asteroid = contact.bodyA.node;
        }

        [self runAction:[SKAction playSoundFileNamed:@"explosion_large.caf" waitForCompletion:NO]];

        SKAction *blink = [SKAction sequence:@[[SKAction fadeOutWithDuration:0.1],
                                               [SKAction fadeInWithDuration:0.1]]];
        SKAction *blinkForTime = [SKAction repeatAction:blink count:6];
        [self.spaceship runAction:blinkForTime];

        NSString *explosionPath = [[NSBundle mainBundle] pathForResource:@"RocketFlame" ofType:@"sks"];
        SKEmitterNode *explosion = [NSKeyedUnarchiver unarchiveObjectWithFile:explosionPath];
        CGVector emitterVector = CGVectorMake(spaceship.frame.size.width * 2.0, 0);
        explosion.particlePositionRange = emitterVector;
        [self.spaceship addChild:explosion];

        [self asteroid:(SKSpriteNode *) asteroid didCollideWithasteroid:(SKSpriteNode *) spaceship]; //What does this do?

        [self runAction:[SKAction sequence:@[[SKAction waitForDuration:3.0], [SKAction runBlock:^{
            [self gameEndedWithSuccess:NO];
        }]]]];
    }
    else if (collision == (projectileCategory| asteroidCategory)) {

        SKNode *Projectile, *asteroid;

        if (contact.bodyA.categoryBitMask == asteroidCategory) {
            Projectile= contact.bodyA.node;
            asteroid = contact.bodyB.node;
        }
        else {
            Projectile = contact.bodyB.node;
            asteroid = contact.bodyA.node;
        }

        [self projectile:(SKSpriteNode *) Projectile didCollideWithasteroid:(SKSpriteNode *) asteroid];

        self.asteroidsDestroyed++;
        if (self.asteroidsDestroyed > 30) {
            [self gameEndedWithSuccess:YES];
        }
    }
}

-(void) gameEndedWithSuccess:(BOOL)success
{
    SKTransition *reveal = [SKTransition flipHorizontalWithDuration:0.5];
    SKScene * gameOverScene = [[GameOverScene alloc] initWithSize:self.size won:success];
    [self.view presentScene:gameOverScene transition: reveal];
}