J'ai un CCLayer avec le menu Démarrer de mon application et j'aimerais faire jouer un court métrage en arrière-plan. J'ai réussi à lire un film dans le glView mais quand il joue le menu n'est pas représenté. Pour gérer le film que j'instancier un MPMoviePlayerController puis ajouter son point de vue à la GLView de cette façon:cocos2d: lecture d'une vidéo en arrière-plan d'un menu
[[[CCDirector sharedDirector] openGLView] addSubview:moviePlayer.view];
J'ai vu cette question était tout à fait similaire
How to have a menu when a movie is playing-iphone cocos2d
mais je voudrais savoir s'il y a une meilleure solution, peut-être une qui me permettrait d'exploiter encore les entités du framework cocos2d (et non mes propres vues).
J'ai essayé d'envoyer le moviePlayer.view à dos de cette façon
[theView sendSubviewToBack:moviePlayer.view];
mais le menu est Stil caché par le film ...
(plusieurs heures plus tard ..)
Ok, comme vous pouvez le lire dans le premier commentaire, j'ai réalisé que (probablement) le seul moyen est d'exploiter les vues personnalisées. Je l'ai fait et il s'exécute dans le simulateur en ajoutant des vues au glView après le moviePlayer.view. Cependant, quand je le lance sur mon IPod Touch cible avec un FW 3.1.3, la vue du film est toujours au top. J'ai donc réalisé que MPMoviePlayerController crée sa propre fenêtre et sa propre vue. Certains messages (comme celui-ci Overlay on top of Streaming MPMoviePlayerController) suggèrent d'intercepter l'événement la nouvelle fenêtre est chargée et seulement ensuite ajouter les sous-vues.
c'est ce que j'ai essayé de faire mais cet événement n'est en fait jamais détecté sur le simulateur ni sur l'Ipod cible. J'ai donc ajouté un sélecteur prévu - (void) mise à jour qui est mis en œuvre ainsi:
-(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];
}
}
mais le film reste sur le dessus
plaît les gars tout d'aide serait très apprécié!
(quelques jours plus tard ...) J'ai également attendu pendant 2 secondes, alors que le film est en cours d'exécution, pour ajouter mon logo sous forme de sous-vue du ciné-lecteur. Cela fonctionne correctement sur le simulateur mais sur l'Ipod (3.1.3) il en résulte un résultat différent. La première fois que le film est joué, le logo n'est pas représenté (film en haut). Cependant, dès que le film se termine, la méthode de jeu est collée, à partir de la deuxième fois le logo est représenté avec le film sur le fond (Est-ce que je le ferais). Cela a-t-il un sens pour vous?
je vraiment besoin de comprendre comment résoudre ce problème, il est tout à fait ridicule que j'ai reussi développer un jeu en 2 mois et maintenant je suis coincé de 2 semaines pour le menu de démarrage :)
Quoi qu'il en soit, si je a décidé de coller tout le code de la couche que je suis en train de corriger afin que vous puissiez mieux comprendre ce que le problème est (ou du moins est mon espoir :))
+(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];
}
J'ai trouvé ceci: http://www.cocos2d-iphone.org/forum/topic/61 un de ses commentaires dit: "cela ne fonctionne pas parce que l'imageView est ajouté à l'openGLView. ne dessine pas sur l'objet UI La seule façon de le faire est d'utiliser la méthode UI standard, mais ce n'est pas pratique comme cocos2d quand l'animation est impliquée ". C'est possible? cela pourrait être moche ... – Sindico