Iphone cocos2d:在菜单背景中播放视频
我有一个CCLayer和我的应用程序的开始菜单,我想有一个简短的电影在后台播放。 我已经成功地在glView中播放了一部电影,但是当它播放时,菜单并没有显示出来。 为了处理电影,我实例化了一个MPMoviePlayerController 然后我通过以下方式将其视图添加到glView: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
[[[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那样方便”。。。