2012-11-25 131 views
1

我在爲我的遊戲創建按鈕類時出現問題。 我的按鈕圖像在精靈表中,我在Zwoptex創建的女巫。 問題是程序在加載精靈時崩潰。cocos2d-iphone精靈表格加載

這裏是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 

這裏是實現:

#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 

程序崩潰,當我在其他地方調用這個方法:

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

這裏是程序輸出:

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

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

最後這裏是Zwoptex產生的plist:

<?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> 

回答

1

嗯...看起來不錯給我。可能找不到.plist。驗證.plist是否是您的目標的成員,並且文件名大小寫在您的資源目錄中是正確的。

而且,在這條線:

[[self parent] addChild:buttonsNode]; 

不能肯定,當你調用init方法父設置。

編輯:在你從plist添加精靈幀的行上放置一個斷點。在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; 
.... 

並驗證dict不是零。 cocos2d用於靜默加載目錄的方法'失敗',即如果文件不存在,則返回一個零字典對象。如果文件存在,則問題是其他問題。如果dict是零,那麼...繼續查看你的項目設置,直到找到問題,或者使用文件命名(注意項目和查找器中文件名的情況:必須相同),或者文件是不是你的目標的成員。此外,如果您爲項目啓用了HD,請確保plist是「Buttons-hd.plist」,與紋理相同(Buttons-hd.png)。同樣,CCSpriteBatchNode沒有任何缺失紋理,失敗時默默無聞。

+0

plist位於resource/Plist庫和資源庫中的.png中,但仍然無效。 我不知道,可能是什麼問題... – kommancs96

+0

見上面編輯找出是否有'文件'問題。 – YvesLeBorg