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