2

SOでの初投稿です。すべての SO ユーザーに感謝したいと思います。彼らの貢献は、すべてのプロジェクトで私を大いに助けてくれました。私はiPhoneアプリケーション開発シーンに不慣れです。

このプロジェクトの目的は、ムービー プレーヤー オブジェクト (デバイス上の *.mov ファイル) の上にカスタムのインタラクティブなユーザー インターフェイス (UI) を持つことです。基礎となる FullScreen MoviePlayers は複数になる可能性があり、ユーザーの操作に基づいて別のものに切り替える必要があります。

私は cocos2D を使用して、カスタムのインタラクティブな UI とエフェクト (スワイプ ジェスチャのパーティクル エフェクトなど) を実現しています。また、Multiple MPMoviePlayerViewController* を使用して常駐ムービー ファイル (*.mov) をフルスクリーン モードで再生しています (MoviePlayer サンプルを参照)。

要件は、タッチ検出時にデフォルトの moviePlayer と代替の moviePlayer を切り替えることで、ムービーを切り替えることです。また、切り替えはできるだけスムーズにする必要があります。

スムーズな切り替えを実現するために、それぞれAppController のオブジェクトmoviePlayerViewControllersのサブビューである2 つの を使用しています。UIView

問題 a: これがムービーの切り替えを実現する正しい方法かどうかわかりません。

問題b:私の現在の解決策では。DefaultMoviePlayerは縦向きモードで回転し、moviePlayer オブジェクトが表示されないことがあります。動作に一貫性がありません。

問題 c: 代替ムービー プレーヤー ( MPMoviePlayerViewControllerUIWindow のサブビューとして最初に追加されたオブジェクト) はデバイスの回転時に回転し、既定のムービー プレーヤー (MPMoviePlayerViewController後に追加されたオブジェクト) は正しく動作しません。論理的な説明が思いつきません。MPMoviePlayerViewController独自のウィンドウを作成することを読んだどこかで、それが問題になる可能性があります。

    // From AppController.h
    UIWindow *window; // Parent application window
    UIView *viewCocos2D;    // Cocos View
    UIView *viewMovie;      // Default MoviePlayer View
    UIView *viewMovieAlternate;  // Alternate MoviePlayer View

// From AppController.m
// From DidAppFinishLoading
{
... 
 // Init the window
 window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 

        // Init the views (Cocos2d, MOviePlayer and AlternateMOviePlayer)
 viewCocos2D = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
 viewMovie = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
 viewMovieAlternate = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 

 // cocos2d will inherit these values
 [viewCocos2D setUserInteractionEnabled:YES]; 
 [viewCocos2D setMultipleTouchEnabled:YES];


 // create OpenGL view and attach it to a window
 //[[[UIApplication sharedApplication] keyWindow] addSubview:window];
 [[CCDirector sharedDirector] attachInView:viewCocos2D];

 // Default texture format for PNG/BMP/TIFF/JPEG/GIF images
 [CCTexture2D setDefaultAlphaPixelFormat:kCCTexture2DPixelFormat_RGBA8888]; 


 // Create a 
 customMoviePlayerWithUI = [[CustomMoviePlayerWithUI alloc] initWithSuperView:window andMovieView:viewMovie andAlternateView:viewMovieAlternate andSelf:self];
 CCScene *scene = [CCScene node];
 CocosCustomLayer *cocosLayer = [customMoviePlayerWithUI cocosLayer]; 


 [window addSubview:viewMovieAlternate];
 [window addSubview:viewMovie];
 // somehow this order lets cocos2D receive the touch events
 [window addSubview:viewCocos2D]; 


 [scene addChild: cocosLayer];
 [window makeKeyAndVisible];

 [[CCDirector sharedDirector] runWithScene: scene];
 [UIAccelerometer sharedAccelerometer].delegate = self;


 [customMoviePlayerWithUI start];
 [self didRotate:nil];

 ...
}

したがって、ビュー階層は

別のムービー プレーヤー ビューが一番下にあります。デフォルトのムービー プレーヤー ビューが次にあります。Cocos2D レイヤー ビューが一番上にあります。Cocos2D ビューもすべてのイベントを受け取ります。

    // From CustomMoviePlayerWithUI.h
 MPMoviePlayerViewController *moviePlayerView;
 MPMoviePlayerViewController *moviePlayerViewAlternate; 

// These delegates are used frequently to invoke some functions
 AppController* delegateApplication;
 UIView  *delegateSuperWindow;  // Window which contains everything - 
 UIView *delegateView;         // View containing default MoviePlayer
 UIView *delegateViewAlternate;// View containing alternate MoviePlayer

以下は、moviePlayerViewController の初期化コードです。基本的には、2 つの moviePlayerViewController オブジェクトを割り当てて初期化し、それらを AppController の Default および Alternate UIView オブジェクトにサブビューとして追加します。

// From customMoviePlayer.m
// initAndPlayMovie is called from the init of CustomMoviePlayer
- (void)initAndPlayMovie:(UIView *)view andAlternateView:(UIView*) viewMovieAlternate
{
 // Initialize a movie player object with the specified URL
 moviePlayerView = [[MPMoviePlayerViewController alloc] init];
 moviePlayerViewAlternate = [[MPMoviePlayerViewController alloc] init];


 [moviePlayerView shouldAutorotateToInterfaceOrientation:UIInterfaceOrientationLandscapeLeft];
 [moviePlayerViewAlternate shouldAutorotateToInterfaceOrientation:UIInterfaceOrientationLandscapeLeft];

 //if (moviePlayer)
 if (moviePlayerView && moviePlayerViewAlternate)
 {
  [[[moviePlayerView moviePlayer] backgroundView] setBackgroundColor:[UIColor blueColor]];
  [[[moviePlayerViewAlternate moviePlayer] backgroundView] setBackgroundColor:[UIColor redColor]];





  //[moviePlayerView setWantsFullScreenLayout:YES];

  // private API call.. don't use it..
  //[mp setOrientation:UIDeviceOrientationPortrait animated:NO];


  [view addSubview:[moviePlayerView view]];
  [viewMovieAlternate addSubview:[moviePlayerViewAlternate view]];
  //[view bringSubviewToFront:[moviePlayerView view]];

  //[[moviePlayerView moviePlayer] play]; 
 }
}

ご協力いただきありがとうございます。詳細が必要な場合はお知らせください。

4

0 に答える 0