У меня есть CCLayer с начальным меню моего приложения, и я хотел бы, чтобы в фоновом режиме был короткий фильм. Я преуспел в том, чтобы играть в фильм в glView, но когда он играет, меню не изображается. Чтобы обработать фильм, я создаю MPMoviePlayerController и затем я добавляю его представление в glView следующим образом:
[[[CCDirector sharedDirector] openGLView] addSubview:moviePlayer.view];
Я видел, что этот вопрос был очень похож
Как иметь меню при воспроизведении фильма - iphone cocos2d
но я хотел бы знать, есть ли лучшее решение для него, возможно, такое, которое позволило бы мне использовать сущности framework cocos2d (а не мои собственные представления).
Я попытался отправить moviePlayer.view, чтобы вернуться сюда
[theView sendSubviewToBack:moviePlayer.view];
но меню скрыто в фильме...
(много часов спустя..)
Хорошо, как вы можете прочитать в первом комментарии, я понял, что (возможно) единственный способ использования пользовательских представлений. Я сделал это, и он запускается в симуляторе, добавив любые взгляды в glView после moviePlayer.view. Однако, когда я запускаю его на моем целевом IPod touch с 3.1.3 FW, просмотр фильма всегда на высоте. Поэтому я понял, что MPMoviePlayerController фактически создает собственное окно и собственное представление. Некоторые сообщения (например, Наложение поверх потокового MPMoviePlayerController) предлагают перехватить событие, в которое загружается новое окно, и только затем добавить подпрограммы.
это то, что я пытался сделать, но это событие на самом деле никогда не попадало ни на симулятор, ни на целевой Ipod. Поэтому я добавил обновление по расписанию - (void), которое реализовано следующим образом:
-(void) update{
NSArray *windows = [[UIApplication sharedApplication] windows];
if ([windows count] > 1)
{
UIImageView *logo = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"logo.png"]];
UIView *theView = [[CCDirector sharedDirector] openGLView];
[logo setCenter:ccp(240,80)];
[moviePlayer.view addSubview:logo];
[self unscheduleAllSelectors];
}
}
но фильм по-прежнему остается на высоте
Пожалуйста, ребята, любая помощь была бы очень оценена!
(через несколько дней...) Я также ждал 2 секунды, пока фильм на самом деле работает, чтобы добавить мой логотип в качестве подсмотра фильма. Он корректно работает на симуляторе, но на Ipod (3.1.3) получается другой результат. При первом воспроизведении фильма логотип не отображается (фильм сверху). Однако, так как как только фильм заканчивается, метод воспроизведения заштриховывается, начиная со второго раза, когда логотип отображается с фильмом на фоне (Is я would). Это имеет какой-то смысл для вас?
Мне действительно нужно понять, как исправить эту проблему, это довольно смешно, я добился разработки игры через 2 месяца, и теперь я застрял от 2 недель для стартового меню:)
В любом случае, если я решил вставить весь код слоя, который я пытаюсь исправить, чтобы вы могли лучше понять, в чем проблема (или, по крайней мере, это моя надежда:))
+(id) scene
{
// 'scene' is an autorelease object.
CCScene *scene = [CCScene node];
// 'layer' is an autorelease object.
StartMenu *layer = [StartMenu node];
// add layer as a child to scene
[scene addChild: layer];
// return the scene
return scene;
}
-(void) update{
timer ++;
if (timer==120){
UIImageView *logo = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"stupidLogo.png"]];
UIView *theView = [[CCDirector sharedDirector] openGLView];
[logo setCenter:ccp(240,80)];
//logo.transform = CGAffineTransformMakeRotation(3.14/2);
[moviePlayer.view addSubview:logo];
[self unscheduleAllSelectors];
}
}
-(id) init{
self = [super init];
[self schedule: @selector(update)];
NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"test_005_conv_06.mp4" ofType:@""]];
moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:url];
// Register to receive a notification when the movie has finished playing.
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(moviePlayBackDidFinish:)
name:MPMoviePlayerPlaybackDidFinishNotification
object:moviePlayer];
if ([moviePlayer respondsToSelector:@selector(view)]) {
if([MPMoviePlayerController instancesRespondToSelector:@selector(view)]){
// Use the new 3.2 style API
moviePlayer.controlStyle = MPMovieControlStyleNone;
moviePlayer.shouldAutoplay = FALSE;
// This does blows up in cocos2d, so we'll resize manually
// [moviePlayer setFullscreen:YES animated:YES];
[moviePlayer.view setTransform:CGAffineTransformMakeRotation((float)M_PI_2)];
CGSize winSize = [[CCDirector sharedDirector] winSize];
moviePlayer.view.frame = CGRectMake(0, 0, winSize.height, winSize.width); // width and height are swapped after rotation
[[[CCDirector sharedDirector] openGLView] addSubview:moviePlayer.view];
[moviePlayer play];
}
} else {
// Use the old 2.0 style API
moviePlayer.movieControlMode = MPMovieControlModeHidden;
[moviePlayer play];
}
return self;
}
- (void)moviePlayBackDidFinish:(NSNotification*)notification {
MPMoviePlayerController *moviePlayer = [notification object];
[moviePlayer play];
}