2012-11-25 3 views
1

J'ai un problème en créant une classe de bouton pour mon jeu. Mes images de bouton sont dans une feuille de sprite, que j'ai créée dans Zwoptex. Le problème est que le programme se bloque lors du chargement des sprites.feuille de sprite cocos2d-iphone chargement

Voici Buttons.h:

#import "CommonProtocols.h" 
#import "GameObject.h" 


@interface Buttons : CCSprite 
{ 
    CCSprite *buttonSprite; 
    ButtonTypes *buttonType; 
    CCSpriteBatchNode *buttonsNode; 
} 
+(id)button; 
-(id)initButtonWithType:(ButtonTypes)bType; 

@property (readwrite,assign)CCSpriteBatchNode* buttonsNode; 
@property (readwrite,assign)CCSprite *buttonSprite; 
@property (readonly)ButtonTypes *buttonType; 
@end 

Et voici la mise en œuvre:

#import "Buttons.h" 

@implementation Buttons 
@synthesize buttonSprite; 
@synthesize buttonsNode; 
@synthesize buttonType; 
-(void)dealloc 
{ 
    [buttonSprite release]; 
    [super dealloc]; 
} 
+(id)button 
{ 
    return [[[self alloc] init] autorelease]; 
} 


-(id)initButtonWithType:(ButtonTypes)btype 
{ 
    if(self=[super init]){ 

    buttonsNode = [CCSpriteBatchNode batchNodeWithFile:@"Buttons.png"]; 
    [[self parent] addChild:buttonsNode]; 

    [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"Buttons.plist"]; 

    switch (btype) 
    { 
     case kFireButton: 
      [self setButtonSprite:[CCSprite spriteWithSpriteFrameName:@"firebutton.png"]]; 
      [buttonsNode addChild:[self buttonSprite]]; 
      return self; 
      break; 

     case kLeftButton: 
      [self setButtonSprite:[CCSprite spriteWithSpriteFrameName:@"leftbutton.png"]]; 
      [buttonsNode addChild:[self buttonSprite]]; 
      return self; 
      break; 

     case kRightButton: 
      [self setButtonSprite:[CCSprite spriteWithSpriteFrameName:@"rightbutton.png"]]; 
      [buttonsNode addChild:[self buttonSprite]]; 
      return self; 
      break; 

     case kReplayButton: 
      [self setButtonSprite:[CCSprite spriteWithSpriteFrameName:@"replaybutton.png"]]; 
      [buttonsNode addChild:[self buttonSprite]]; 
      return self; 
      break; 


     default: 
      NSLog(@"NO button"); 
      break; 

     } 

    } 
return self; 
} 
@end 

Le programme plante quand je l'appelle ailleurs ces méthodes:

Buttons *myButton = [[Buttons button] initButtonWithType:kFireButton]; 
     [self addChild:myButton]; 

Et voici ce que le programme produit:

cocos2d: CCSpriteFrameCache: Frame 'firebutton.png' not found 

*** Assertion failure in +[CCSprite spriteWithSpriteFrameName:], 

Et enfin voici le plist que Zwoptex produit:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
    <key>frames</key> 
    <dict> 

     <key>firebutton.png</key> 
     <dict> 
      <key>aliases</key> 
      <array> 

      </array> 
      <key>spriteColorRect</key> 
      <string>{{1, 2}, {38, 40}}</string> 
      <key>spriteOffset</key> 
      <string>{0, 2}</string> 
      <key>spriteSize</key> 
      <string>{38, 40}</string> 
      <key>spriteSourceSize</key> 
      <string>{40, 48}</string> 
      <key>spriteTrimmed</key> 
      <true/> 
      <key>textureRect</key> 
      <string>{{51, 1}, {38, 40}}</string> 
      <key>textureRotated</key> 
      <false/> 
     </dict> 

     <key>leftbutton.png</key> 
     <dict> 
      <key>aliases</key> 
      <array> 

      </array> 
      <key>spriteColorRect</key> 
      <string>{{1, 0}, {46, 47}}</string> 
      <key>spriteOffset</key> 
      <string>{0, -0}</string> 
      <key>spriteSize</key> 
      <string>{46, 47}</string> 
      <key>spriteSourceSize</key> 
      <string>{48, 47}</string> 
      <key>spriteTrimmed</key> 
      <true/> 
      <key>textureRect</key> 
      <string>{{1, 52}, {46, 47}}</string> 
      <key>textureRotated</key> 
      <false/> 
     </dict> 

     <key>replaybutton.png</key> 
     <dict> 
      <key>aliases</key> 
      <array> 

      </array> 
      <key>spriteColorRect</key> 
      <string>{{1, 0}, {46, 47}}</string> 
      <key>spriteOffset</key> 
      <string>{0, -0}</string> 
      <key>spriteSize</key> 
      <string>{46, 47}</string> 
      <key>spriteSourceSize</key> 
      <string>{48, 47}</string> 
      <key>spriteTrimmed</key> 
      <true/> 
      <key>textureRect</key> 
      <string>{{49, 52}, {46, 47}}</string> 
      <key>textureRotated</key> 
      <false/> 
     </dict> 

     <key>rightbutton.png</key> 
     <dict> 
      <key>aliases</key> 
      <array> 

      </array> 
      <key>spriteColorRect</key> 
      <string>{{1, 0}, {46, 47}}</string> 
      <key>spriteOffset</key> 
      <string>{0, -0}</string> 
      <key>spriteSize</key> 
      <string>{46, 47}</string> 
      <key>spriteSourceSize</key> 
      <string>{48, 47}</string> 
      <key>spriteTrimmed</key> 
      <true/> 
      <key>textureRect</key> 
      <string>{{1, 1}, {48, 49}}</string> 
      <key>textureRotated</key> 
      <false/> 
     </dict> 

    </dict> 
    <key>metadata</key> 
    <dict> 
     <key>version</key> 
     <string>1.5.5</string> 
     <key>format</key> 
     <integer>3</integer> 
     <key>size</key> 
     <string>{128, 128}</string> 
     <key>name</key> 
     <string>Buttons</string> 
     <key>premultipliedAlpha</key> 
     <false/> 
     <key>target</key> 
     <dict> 
      <key>name</key> 
      <string>default</string> 
      <key>textureFileName</key> 
      <string>Buttons</string> 
      <key>textureFileExtension</key> 
      <string>.png</string> 
      <key>coordinatesFileName</key> 
      <string>Buttons</string> 
      <key>coordinatesFileExtension</key> 
      <string>.plist</string> 
      <key>premultipliedAlpha</key> 
      <false/> 
     </dict> 
    </dict> 
</dict> 
</plist> 

Répondre

1

Hmmm ... regarde ok pour moi. Probablement ne pas trouver le .plist. Vérifiez que le fichier .plist est membre de votre cible et que le nom du fichier est correct dans votre répertoire de ressources.

En outre, sur cette ligne:

[[self parent] addChild:buttonsNode]; 

pas certain que parent est réglé lorsque vous appelez la méthode d'initialisation. Editer: place un point d'arrêt sur la ligne où vous ajoutez des images-objets du plist. Entrez dans jusqu'à ce que vous êtes ici, dans le code de CCSpriteFrameCache:

-(void) addSpriteFramesWithFile:(NSString*)plist 
{ 
    NSAssert(plist, @"plist filename should not be nil"); 

    if(! [loadedFilenames_ member:plist]) { 

     NSString *path = [[CCFileUtils sharedFileUtils] fullPathFromRelativePath:plist]; 
     NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path]; 

     NSString *texturePath = nil; 
.... 

et vérifier que dict est non nul. La méthode utilisée par cocos2d pour charger un répertoire «échoue» en silence, c'est-à-dire retourne un objet Dictionary nul si le fichier n'existe pas. Si le fichier existe, le problème est autre. Si dict est nul, bien ... continuez à chercher dans votre configuration de projet jusqu'à ce que vous trouviez le problème, soit avec le nommage des fichiers (attention au nom de fichier dans le projet et dans finder: DOIT être identique), soit le fichier est pas un membre de votre cible. De plus, si vous avez activé HD pour votre projet, assurez-vous que le plist est "Buttons-hd.plist", même chose pour la texture (Buttons-hd.png). De même, CCSpriteBatchNode ne fait rien avec une texture manquante, échoue silencieusement.

+0

Le plist est dans la bibliothèque de ressources/Plists et le .png dans la bibliothèque de ressources mais ne fonctionne toujours pas. Je n'ai aucune idée, quel peut être le problème ... – kommancs96

+0

voir ci-dessus modifier pour savoir si vous avez un problème de «fichier». – YvesLeBorg

Questions connexes