Iphone cocos2d:在菜单背景中播放视频

Iphone cocos2d:在菜单背景中播放视频,iphone,objective-c,cocos2d-iphone,Iphone,Objective C,Cocos2d Iphone,我有一个CCLayer和我的应用程序的开始菜单,我想有一个简短的电影在后台播放。 我已经成功地在glView中播放了一部电影,但是当它播放时,菜单并没有显示出来。 为了处理电影,我实例化了一个MPMoviePlayerController 然后我通过以下方式将其视图添加到glView: [[[CCDirector sharedDirector] openGLView] addSubview:moviePlayer.view]; -(void) update{ NSArray *wind

我有一个CCLayer和我的应用程序的开始菜单,我想有一个简短的电影在后台播放。 我已经成功地在glView中播放了一部电影,但是当它播放时,菜单并没有显示出来。 为了处理电影,我实例化了一个MPMoviePlayerController 然后我通过以下方式将其视图添加到glView:

[[[CCDirector sharedDirector] openGLView] addSubview:moviePlayer.view];
-(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];
    }
}
我看到这个问题很相似

但我想知道是否有更好的解决方案,可能是让我仍然可以利用cocos2d框架实体(而不是我自己的视图)的解决方案

我已经试着把影音播放器.view用这种方式送回去了

[theView sendSubviewToBack:moviePlayer.view];
但是菜单仍然被电影隐藏着

(几个小时后……)

好的,正如您在第一条评论中看到的,我已经意识到(可能)唯一的方法是利用自定义视图。我这样做了,它在模拟器中运行,在moviePlayer.view之后向glView添加任何视图。然而,当我用3.1.3 FW在我的目标iPodtouch上运行它时,电影视图总是在顶部。 因此,我意识到MPMoviePlayerController实际上创建了自己的窗口和视图。一些帖子(像这样)建议在加载新窗口时拦截事件,然后才添加子视图

这就是我试图做的,但无论是在模拟器上还是在目标Ipod上,都没有捕捉到这一事件。 因此,我添加了一个按计划的选择器-(void)更新,其实现方式如下:

[[[CCDirector sharedDirector] openGLView] addSubview:moviePlayer.view];
-(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)上,结果不同。第一次播放电影时,不会显示徽标(电影在顶部)。然而,由于电影一结束,播放方法就被收集起来,从第二次以电影为背景描绘徽标开始(我会这样做)。这对你有意义吗

我真的需要了解如何解决这个问题。我在两个月内成功开发了一款游戏,这太荒谬了,现在我在开始菜单上被困了两周:)

无论如何,如果我决定粘贴我试图修复的层的全部代码,以便您能够更好地找出问题所在(或者至少我希望如此:))


在花了一些时间研究这个问题后,我找到了答案。(我也想这样做,但以后再做,所以我还是现在就开始吧!)

我使用了由抗坏血酸提供的代码和技术。除非还将以下行添加到EAGLView中,否则此操作不完整:

glView.opaque = NO;
电影视图位于EagleView的一侧,并推到后面,以获取您正在寻找的内容。你可能还需要调整EagleView的透明度,就像它在那篇文章中提到的那样。希望有帮助


这里列出了我需要修改的内容

您需要将apple的
mediaPlayer.framework
添加到项目中,并在应用程序delegate.h中包含以下行:

#import <MediaPlayer/MediaPlayer.h>
ApplicationIDFinishLaunching:
中创建EAGLView时,请更改以下内容:

将像素格式从旧值更改为:

// 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”选项自动完成的。如果不希望电影重复,也可以在此处选择“MPMovierPeatModeNone”选项

我还应该注意到,我无法让它与旧的3.2版之前的API一起工作(因此在您的3.1.3版本中它不工作),视频没有通过EagleView显示。我不确定那里发生了什么,但我没有看到具体的解决办法。

我发现:它的一条评论说:“它不起作用,因为imageView已添加到openGLView。cocos2d似乎无法在UI对象上绘制。这样做的唯一方法是使用标准的UI方法,但当涉及动画时,它不像cocos2d那样方便”。。。