簡體   English   中英

[SKAction playSoundFileNamed:waitForCompletion:]之后等待

[英]Wait after [SKAction playSoundFileNamed:waitForCompletion:]

好吧,這讓我覺得自己像個白痴。

我的游戲中有一種方法可以使文本框中的文本一次彈出一個動畫,從而使文本動畫。 在我的DDTextBox類中,有一種對其進行動畫處理的方法稱為animateText 這是它的編碼:

for (NSUInteger i = 1; i <= _text.length; i++)
    {
        [_scene runAction:[SKAction playSoundFileNamed:@"regularTextBeep.m4a" waitForCompletion:YES] completion:^{
            [_scene runAction:[SKAction waitForDuration:0.2] completion:^{
                ((SKLabelNode*)[_scene childNodeWithName:@"textBoxText"]).text = (NSString*)[_text substringToIndex:i];

                ((SKLabelNode*)[_scene childNodeWithName:@"textBoxText"]).position = CGPointMake(20 + (((SKLabelNode*)[_scene childNodeWithName:@"textBoxText"]).frame.size.width / 2.0), ((SKLabelNode*)[_scene childNodeWithName:@"insideOfTextBox"]).frame.size.height - (((SKLabelNode*)[_scene childNodeWithName:@"textBoxText"]).frame.size.height / 2.0) - 15);
                NSLog(@"Textbox loading a letter on iteration %u", i);
            }];
        }];
    }
    completion();

這是為了使名為textBoxText的節點textBoxText更改,因此它是字符串_text的子字符串, 直至索引i ,然后等待聲音文件結束,直到移至下一個字符。

目前,聲音只播放一次,所有文本同時彈出。 該音頻文件的長度約為200毫秒。 我將如何使其反復播放相同的文件? 我可以在[self runAction:completion:]的方法調用之外聲明SKAction嗎? 有任何想法嗎?

您可以通過創建一系列操作來做到這一點。 您可能需要進行一些調整。

NSMutableArray *marrActions = [NSMutableArray new];

for (NSUInteger i = 1; i <= _text.length; i++)
{

    [marrActions addObject:[SKAction playSoundFileNamed:@"regularTextBeep.m4a" waitForCompletion:YES]];
    [marrActions addObject:[SKAction waitForDuration:0.2]];
    [marrActions addObject:[SKAction runBlock:^{
        ((SKLabelNode*)[_scene childNodeWithName:@"textBoxText"]).text = (NSString*)[_text substringToIndex:i];

        ((SKLabelNode*)[_scene childNodeWithName:@"textBoxText"]).position = CGPointMake(20 + (((SKLabelNode*)[_scene childNodeWithName:@"textBoxText"]).frame.size.width / 2.0), ((SKLabelNode*)[_scene childNodeWithName:@"insideOfTextBox"]).frame.size.height - (((SKLabelNode*)[_scene childNodeWithName:@"textBoxText"]).frame.size.height / 2.0) - 15);
        NSLog(@"Textbox loading a letter on iteration %u", i);
    }]];
}

[_scene runAction:[SKAction sequence:marrActions] completion:completion]; //Pass off the completion block here

我還建議這樣做只是為了簡化該代碼:

SKLabelNode *textNode = (SKLabelNode*)[_scene childNodeWithName:@"textBoxText"];
SKLabelNode *insideOfTextNode = (SKLabelNode*)[_scene childNodeWithName:@"insideOfTextBox"];

textNode.text = [_text substringToIndex:i];
textNode.position = CGPointMake(20 + (textNode.frame.size.width / 2.0), insideOfTextNode.frame.size.height - (textNode.frame.size.height / 2.0) - 15);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM