【问题标题】:Adding sound to spritekitgame upon gameover transition在游戏结束过渡时为 spritekitgame 添加声音
【发布时间】:2014-07-12 08:10:46
【问题描述】:

我用 sprite kit 做了一个游戏。现在我正在尝试实现一些声音效果。我设法做了一些声音效果,但我陷入了每当你输球时我必须实现声音的部分。因此,当物体接触地面时,您会失败。但是当这种情况发生时,它会过渡到另一个场景。所以我希望在过渡到另一个场景之前播放游戏结束声音。 这就是我得到的:

Myscene.h

#import <AVFoundation/AVFoundation.h>

@interface MyScene : SKScene<SKPhysicsContactDelegate>
@property (strong, nonatomic) AVAudioPlayer *audioPlayer;
@property (strong, nonatomic) SKAction *catchSound;
@property (strong, nonatomic) SKAction *gameoverSound;

Myscene.m

-(id)initWithSize:(CGSize)size {
if (self = [super initWithSize:size]) {

    self.catchSound = [SKAction playSoundFileNamed:@"166331__lokemon44__mushroom.wav" waitForCompletion:NO];
    self.gameoverSound = [SKAction playSoundFileNamed:@"gameover1.wav" waitForCompletion:NO];
    NSURL *url = [[NSBundle mainBundle] URLForResource:@"select" withExtension:@"wav"];
    NSError *error = nil;
    self.audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];

    if (!self.audioPlayer) {
        NSLog(@"Error creating player: %@", error);
          }


    }
return self;

}

-(void)didBeginContact:(SKPhysicsContact *)contact{

 if ((firstBody.categoryBitMask == monsterCategory) != 0 &&
           (secondBody.categoryBitMask == bottomCategory) != 0)
    {
        [self monster:(SKSpriteNode *) firstBody.node didCollideWithbottomGround:(SKSpriteNode *) secondBody.node];

    }
}


-(void)monster:(SKSpriteNode *)monster didCollideWithbottomGround:(SKSpriteNode *)bottomGround {
    [self.monster runAction:self.gameoverSound];
    [self resetDuration];
    [_monster removeFromParent];
    SKTransition *reveal5 = [SKTransition fadeWithDuration:0.5];
    SKScene * InstructionSceneL = [[GameOverScene alloc] initWithSize:self.size score:player_score];
    InstructionSceneL.scaleMode = SKSceneScaleModeAspectFill;
    [self.view presentScene:InstructionSceneL transition:reveal5];

}

【问题讨论】:

    标签: ios xcode audio sprite-kit skscene


    【解决方案1】:

    你可以在这里做的是使用完成块。

    例如:

    定义一个:

    typedef void (^CompletionBlock)();
    
    
    - (void)playSoundWhenMonsterHitsGround:(CompletionBlock)completionBlock
    {
        [self.monster runAction:self.gameoverSound];
        completionBlock();
    }
    

    在你的-(void)monster:(SKSpriteNode *)monster didCollideWithbottomGround:(SKSpriteNode *)bottomGround:

    -(void)monster:(SKSpriteNode *)monster didCollideWithbottomGround:(SKSpriteNode *)bottomGround 
    {
        [self resetDuration];
        [_monster removeFromParent];
        [self playSoundWhenMonsterHitsGround:^
        {
            SKTransition *reveal5 = [SKTransition fadeWithDuration:0.5];
            SKScene * InstructionSceneL = [[GameOverScene alloc] initWithSize:self.size score:player_score];
            InstructionSceneL.scaleMode = SKSceneScaleModeAspectFill;
            [self.view presentScene:InstructionSceneL transition:reveal5];
        }];
    }
    

    希望这会有所帮助。

    【讨论】:

    • 您好,感谢您的帮助,我实现了它,但完成后出现错误(); : 函数“完成”的隐式声明在 C99 中无效
    • 错误消失了,但仍然没有游戏结束声音进入另一个场景。
    • 我使用了你给我的 runAction - (void)playSoundWhenMonsterHitsGround:(CompletionBlock)completionBlock { [self.monster runAction:self.gameoverSound];完成块(); }
    • 你给我的是这个游戏结束声音的唯一 runAction。
    • @RomanoVacca 不,看看你自己的代码。 runAction 是你定义的,不是我定义的。你自己写过代码吗?
    【解决方案2】:
    SystemSoundID soundToPlay;
    
    NSString *path  = [[NSBundle mainBundle] pathForResource:@"gameover1" ofType:@"wav"];
    NSURL *pathURL = [NSURL fileURLWithPath : path];
    AudioServicesCreateSystemSoundID((__bridge CFURLRef) pathURL, &soundToPlay);
    
    //playback
    AudioServicesPlaySystemSound(soundToPlay);
    

    【讨论】:

    • 如果您包含一些关于为什么这是一个解决方案的解释或评论,您的答案将会大大改善。
    【解决方案3】:

    SKAction *sound = [SKAction playSoundFileNamed:@"fileName" waitForCompletion:NO];

    您可以尝试使用 waitForCompletion: 直到它适合您的喜好。

    【讨论】:

      猜你喜欢
      • 2014-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多