2010-12-15 11 views
17

私のアプリのスタートメニューにCCLayerがあり、バックグラウンドでショートムービーを再生したいと考えています。 私はglViewで映画を再生することに成功しましたが、再生時にはメニューが表示されません。私はこの質問をcocos2d:メニューの背景でビデオを再生する

How to have a menu when a movie is playing-iphone cocos2d

かなり類似していたが、私は希望の見てきた

[[[CCDirector sharedDirector] openGLView] addSubview:moviePlayer.view]; 

:私はMPMoviePlayerController をインスタンス化し、その後、私はglViewにこの方法をそのビューを追加動画を処理するために より良い解決策があるかどうか、おそらく私がcocos2dフレームワークエンティティを利用できるようにする(おそらく私自身の見解ではない)かも知れません。

私は...

(多くの時間後に...)

[theView sendSubviewToBack:moviePlayer.view]; 

この方法をバックアップするmoviePlayer.viewを送信しようとしたが、メニューがSTIL​​映画によって隠されています

あなたが最初のコメントを読むことができるように、(おそらく)唯一の方法はカスタムビューを悪用していることに気がつきました。私はそれを行い、moviePlayer.viewの後にglViewに任意のビューを追加してシミュレータで実行します。しかし、3.1.3 FWのターゲットIPodタッチで実行すると、ムービービューは常に上に表示されます。 私は、MPMoviePlayerControllerが実際に独自のウィンドウと独自のビューを作成することを認識しました。いくつかの投稿(このようにOverlay on top of Streaming MPMoviePlayerController)は、新しいウィンドウがロードされたイベントをインターセプトし、サブビューを追加することを推奨します。

これは私がやろうとしたものですが、そのイベントは実際にはシミュレータ上でもターゲットIpod上でも決して捕まえられません。

-(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)では別の結果が得られます。初めて映画が再生されるとき、ロゴは描かれません(上の映画)。しかし、映画が終了するとすぐに、再生メソッドは、ロゴがバックグラウンドで映画に描かれる2回目から始まります(私はそうです)。あなたには意味がありますか?

は、私は本当にそれは私が2ヶ月でゲームを開発するのに非常にばかげsuccededている。この問題を解決する方法を理解する必要があり、今私が持っている場合はとにかくスタート]メニュー:)

のために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]; 
} 
+0

私はこれを見つけました:http://www.cocos2d-iphone.org/forum/topic/61 imageViewがopenGLViewに追加されたため、「cocos2dがそうであるようです。 UIオブジェクトに描画しないでください。そうするための唯一の方法は、標準のUIメソッドを使用することですが、アニメーションが含まれている場合はcocos2dとして便利ではありません。出来ますか?それは醜いかもしれない... – Sindico

答えて

19

(あるいは少なくともそれが私の希望です:))答えが見つかりました。 (私もこれをやってみたいですが、後で、私は今でもそれを得ることがあります!)

私はthis linkの助けを借りて、アスコルビンによってthis linkのコードと技術を使用しました。

glView.opaque = NO; 

映画のビューがEAGLViewの側面に沿っている、とあなたが探しているものを手に入れるためにバックにプッシュ:あなたもEAGLViewに次の行を追加しない限り、それは完全ではありません。また、EAGLViewの透過性を、その記事で言及されているように調整する必要があるかもしれません。希望が役立ちます。


私が変更する必要があったものがここにリストされています。ない1.0Fは0.0fするCCDirectorのsetGLDefaultValues方法で

#import <MediaPlayer/MediaPlayer.h> 

、設定glClearColorのアルファ:

は、あなたのプロジェクトにAppleのmediaPlayer.frameworkを追加する必要があり、アプリデリゲートの.hに次の行を含め

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

applicationDidFinishLaunching:変更に以下の事柄あなたのEAGLViewを作成:

変更pixelForを

// 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'オプションも選択できます。

古い3.2より前のAPIで動作させることができませんでした(3.1.3の場合は動作していませんでした)、ビデオはEAGLViewで表示されませんでした。私はそこで何が起こっているのかは分かりませんが、私はそれについて何をすべきかについて具体的なオプションは見ていません。

+0

+1優れた答えです。 –

関連する問題