Я использую AVPlayer
с SKVideoNode
, прикрепленным к сцене. Это единственный узел для этого SKScene
. Я проигрываю это видео, смешанное с набором других сцен, загруженных различными узлами SKSpriteNode
.
Я хочу предварительно прокрутить AVPlayer
, чтобы видео начало воспроизводиться непосредственно перед тем, как (или когда) оно станет видимым во время перехода SKScene
. И все же я не могу сделать это без промежуточной черной вспышки.
Как только сцена, содержащая видео, исчезает, я сбрасываю ее (я помещаю объект AVPlayer в пользовательский словарь SKVideoNode
). Похоже, это работает:
SKVideoNode *v = ...;
AVPlayer *player = [[v userData] objectForKey:@"AVPlayer"];
if ([player isKindOfClass:[AVPlayer class]]) {
[player seekToTime:kCMTimeZero];
Когда вот-вот должна появиться сцена, содержащая видео, я делаю следующее:
SKTransition *trans = [SKTransition flipHorizontalWithDuration:1.0];
[self.skView presentScene:theScene transition:trans];
[self performSelector:@selector(startVideoInScene:)
withObject:theScene
afterDelay:0.2];
тогда...
- (BOOL)startVideoInScene:(SKScene *)theScene
{
for (SKNode *n in [theScene children])
if ([n isKindOfClass:[SKVideoNode class]]) {
SKVideoNode *v = (SKVideoNode *)n;
AVPlayer *player = [[v userData] objectForKey:@"AVPlayer"];
if ([player isKindOfClass:[AVPlayer class]]) {
[v play];
return YES;
}
}
return NO;
}
Это не работает без запуска с короткой продолжительностью черного перед видео.
Кто-нибудь имел успех с этим?
У меня есть навязчивое подозрение, что весь контент на SKScene
приостанавливается во время его перехода, и нет никакого способа обойти это. Ну, помимо перехода из всех узлов текущей сцены, сохранения этой текущей сцены и перехода на нее нового SKVideoNode
.