[英]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.