3 votes

Cocos2D CCScene : écran noir, rien ne se passe ?

Cela fait trois jours que j'essaie de mettre à niveau mon logiciel Cocos2D. 1.1.0-pre->2.0rc0a Cependant, c'est la tâche la plus difficile à laquelle j'ai été confronté dans la création de mon application jusqu'à présent. Donc, à peu près tout fonctionnait bien dans Cocos2D 1.1, mes images se chargeaient, tout fonctionnait, etc... Maintenant, dans 2.0rc0a Il y a juste un écran noir ET pourtant toutes mes méthodes sont appelées !

Voici quelques informations sur le code que j'utilise, les dispositifs, les journaux, etc...

Version de Xcode

1. Xcode version: 4.3.2

Dispositifs testés sur

2. A) Devices: iPhone 4S - 5.0.1 (doesn't work)
B) iPad 3 - 5.1 (doesn't work)
C) iPhone 5.1 simulator (doesn't work)
D) iPad 5.1 simulator (doesn't work)

Mon code

J'ai une classe UIViewController qui contient le CCGLView. J'ai ensuite une classe CCLayer qui contient tout ce qui concerne le jeu proprement dit. Le code de la classe CCLayer est correct car il fonctionne dans Cocos2D 1.1.0-pre. Je vais donc publier le code de la classe UIViewController :

- (void)viewDidLoad {
    [super viewDidLoad];

    // Create an CCGLView with a RGB565 color buffer, and a depth buffer of 0-bits
    CCGLView *glView = [CCGLView viewWithFrame:[self.view bounds]
                                   pixelFormat:kEAGLColorFormatRGB565   //kEAGLColorFormatRGBA8
                                   depthFormat:0    //GL_DEPTH_COMPONENT24_OES
                            preserveBackbuffer:NO
                                    sharegroup:nil
                                 multiSampling:NO
                               numberOfSamples:0];
    director_ = (CCDirectorIOS*) [CCDirector sharedDirector];
    director_.wantsFullScreenLayout = YES;
    [director_ setDisplayStats:YES];
    [director_ setAnimationInterval:1.0/60];
    [director_ setView:glView];
    [director_ setDelegate:self];
    [director_ setProjection:kCCDirectorProjection2D];
    [director_ setDepthTest:FALSE];
    if(![director_ enableRetinaDisplay:YES])
        CCLOG(@"Retina Display Not supported");
    [CCTexture2D setDefaultAlphaPixelFormat:kCCTexture2DPixelFormat_RGBA8888];
    [CCFileUtils setiPhoneRetinaDisplaySuffix:@"@2x"];
    [CCFileUtils setiPadSuffix:@"-72"];
    [CCFileUtils setiPadRetinaDisplaySuffix:@"@2x~ipad"];
    [CCTexture2D PVRImagesHavePremultipliedAlpha:YES];
    [director_ pushScene:[CCSceneGame scene]];
}

J'ai ensuite cette méthode CCScene de base dans ma classe CCLayer :

+(CCScene *) scene
{
    CCScene *scene = [CCScene node];
    CCSceneGame *layer = [CCSceneGame node];
    [scene addChild:layer];
    return scene;
}

La plupart de ce code est également copié directement à partir des projets de modèles. J'ai également déclaré les délégués dans les .h.

Sortie de console

C'est la console que j'ai testée sur mon iPhone 4S 5.0.1 :

2012-03-31 17:14:54.484 App[56089:707] cocos2d: OS version: 5.0.1 (0x05000100)
2012-03-31 17:14:54.485 App[56089:707] cocos2d: GL_VENDOR:   Imagination Technologies
2012-03-31 17:14:54.486 App[56089:707] cocos2d: GL_RENDERER: PowerVR SGX 543
2012-03-31 17:14:54.486 App[56089:707] cocos2d: GL_VERSION:  OpenGL ES 2.0 IMGSGX543-63.14.2
2012-03-31 17:14:54.488 App[56089:707] cocos2d: GL_MAX_TEXTURE_SIZE: 4096
2012-03-31 17:14:54.488 App[56089:707] cocos2d: GL_MAX_TEXTURE_UNITS: 8
2012-03-31 17:14:54.489 App[56089:707] cocos2d: GL_MAX_SAMPLES: 4
2012-03-31 17:14:54.489 App[56089:707] cocos2d: GL supports PVRTC: YES
2012-03-31 17:14:54.490 App[56089:707] cocos2d: GL supports BGRA8888 textures: YES
2012-03-31 17:14:54.490 App[56089:707] cocos2d: GL supports NPOT textures: YES
2012-03-31 17:14:54.491 App[56089:707] cocos2d: GL supports discard_framebuffer: YES
2012-03-31 17:14:54.491 App[56089:707] cocos2d: compiled with Profiling Support: NO
2012-03-31 17:14:54.492 App[56089:707] cocos2d: cocos2d v2.0.0-rc0
2012-03-31 17:14:54.493 App[56089:707] cocos2d: Using Director Type:CCDirectorDisplayLink
2012-03-31 17:14:54.745 App[56089:707] cocos2d: CCTexture2D: Using RGBA888 texture since image has no alpha
2012-03-31 17:14:54.891 App[56089:707] cocos2d: CCTexture2D. Can't create Texture. cgImage is nil
2012-03-31 17:14:54.892 App[56089:707] cocos2d: Couldn't add image:particleTexture.png in CCTextureCache
2012-03-31 17:14:54.999 App[56089:707] cocos2d: animation started with frame interval: 60.00

Quelques autres points

  1. Mon application est entièrement UIKit, à l'exception de cette vue.
  2. Je montre au UIViewController où se trouve le CCGLView en faisant [self addSubview :]; si cela fait une différence.
  3. J'ai importé Cocos2D avec succès au point de n'avoir aucun fichier rouge, aucun avertissement, aucune erreur, aucune API dépréciée, etc...
  4. Mes images ont été modifiées pour qu'elles aient les suffixes que j'ai changés dans le code de CCFileUtils. C'est donc : @2x, -72, et @2x~ipad
  5. J'ai aussi vérifié le constructeur d'interface pour voir s'il y a des choses bizarres et il n'y en a pas.

Si quelqu'un a une idée de ce qui se passe, faites-le moi savoir !

Gracias.

2voto

LearnCocos2D Points 43044

Je me répète, mais hélas :

Si vous devez mettre à jour cocos2d dans un projet existant, la chose la plus importante est de supprimer tous les fichiers cocos2d du projet Xcode et du Finder. Déplacez ensuite la nouvelle version de cocos2d à sa place, et ré-adherez-la.

Sinon, vous pouvez vous retrouver avec d'anciens fichiers cocos2d dans votre projet, ou manquer les fichiers nouvellement ajoutés.

Si l'écran reste noir, cela peut indiquer un problème avec les shaders. La nouvelle version de cocos2d possède tous les shaders sous forme de chaînes dans les fichiers header (.h). Si vous ne les avez pas ajoutés, ils ne fonctionneront pas. Je ne sais pas si cela vous donnera un écran noir ou un crash pur et simple.

Enfin, puisque Cocos2D 2.0 utilise OpenGL ES 2.0, vous devrez réécrire tout le code de dessin OpenGL personnalisé que vous avez dans votre projet.

Vous devriez également vérifier que glView n'est pas nul, et peut-être placer un point d'arrêt dans la méthode update (visit/draw) de CCDirector pour vérifier s'il visite effectivement tous les noeuds et les dessine correctement.

1voto

iBrad Apps Points 5618

Bien que tout ce que @LearnCocos2D était vrai. La vraie solution pour moi a été de déclarer un IBOutlet CCGLView dans le fichier .h et de le connecter via Interface Builder.

Je pense qu'il peut y avoir un problème si vous utilisez des projets plus anciens et que vous mettez ensuite à niveau vers Cocos2D pour une raison étrange.

Ainsi, au lieu de le faire de manière programmatique, il suffit de le faire via Interface Builder.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X