Подтвердить что ты не робот

Cocos2d: воспроизведение видео на фоне меню

У меня есть 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];
}
4b9b3361

Ответ 1

Проведя некоторое время с этим, я нашел ответ. (Я тоже хочу это сделать, но позже, чтобы я мог это сделать сейчас!)

Я использовал код и методы в этой ссылке от аскорбинов, с помощью этой ссылки. Он не является полным, если вы также не добавили следующую строку в EAGLView:

glView.opaque = NO;

Вид фильма находится рядом с EAGLView и подталкивается назад, чтобы получить то, что вы ищете. Вам также может потребоваться настроить прозрачность EAGLView, как это упоминается в этом сообщении. Надеюсь, что это поможет.


Здесь перечислены вещи, которые мне нужно изменить.

Вам нужно добавить apple mediaPlayer.framework в свой проект и включить следующую строку в делегат приложения .h:

#import <MediaPlayer/MediaPlayer.h>

В методе CCDirector setGLDefaultValues установите glClearColor alpha равным 0.0f, а не 1.0f:

//  glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

При создании своего EAGLView в applicationDidFinishLaunching: измените следующие вещи:

Измените значение pixelFormat из старого значения:

// kEAGLColorFormatRGB565
kEAGLColorFormatRGBA8

Обязательно добавьте EAGLView в качестве подзадачи (и сделайте его непрозрачным), а не как основной вид:

//  [viewController setView:glView];
    [viewController.view addSubview:glView];
    glView.opaque = NO;

Наконец, перед запуском вашей сцены вы можете добавить свой код для воспроизведения цикла. Я добавил метод для делегата приложения для этого. Вы также можете добавить метод, чтобы остановить воспроизведение фильма здесь в делегате приложения, а также, когда (если?) Вам нужно удалить фильм.

[self startMovie];

и сам метод:

- (void) startMovie
{
    NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"test" ofType:@"m4v"]];
    moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:url];

    if ([moviePlayer respondsToSelector:@selector(setFullscreen:animated:)]) {
        // Use the new 3.2 style API
        moviePlayer.controlStyle = MPMovieControlStyleNone;
        moviePlayer.shouldAutoplay = YES;
        moviePlayer.repeatMode = MPMovieRepeatModeOne;
        CGRect win = [[UIScreen mainScreen] bounds];

        moviePlayer.view.frame = CGRectMake(0, 0, win.size.height, win.size.width);
        [viewController.view  addSubview:moviePlayer.view];
        [viewController.view  sendSubviewToBack:moviePlayer.view];
    } 
    else
    {
        // Use the old 2.0 style API
        moviePlayer.movieControlMode = MPMovieControlModeHidden;
        [moviePlayer play];
    }
}

Обратите внимание, что вам не нужно добавлять наблюдателя, как указано в связанном примере, а также функцию для повторения фильма, это делается автоматически с помощью опции "MPMovieRepeatModeOne". Если вы не хотите, чтобы фильм повторялся, вы также можете выбрать параметр "MPMovieRepeatModeNone".

Я также должен отметить, что мне не удалось заставить это работать со старым API-интерфейсом до 3.2 (поэтому в вашем случае 3.1.3 он не работал), видео не показывалось через EAGLView. Я не уверен, что там происходит, но я не видел конкретных вариантов того, что с этим делать.