2012-11-30 54 views
0

所以我想用pushscene/popscene做一个levelup屏幕。当它是一个空白的场景时,pushscene就起作用,但当它是我想要的场景时不会。我的场景/图层会完全加载所有图像和文字,以显示其确切正确的内容。加载完所有图像后,会出现一个EXC BAD ACCESS,它似乎并未链接到正在发送的任何特定消息。任何帮助或进一步的诊断测试,将不胜感激。EXC BAD ACCESS使用Cocos2d pushscene,适用于空白场景

我有一个版本,我注释了小精灵和标签,它仍然崩溃。有什么大的我失踪了?

编辑:我已经添加了[self = [super init]][super onEnter]方法,但仍然是同样的问题。这是别的。有任何想法吗?

EDITEDIT:我认为这与我正在使用的optionsArray有关,不知道需要保留哪些对象。该阵列是一个CCArray并包含不同容量

#import "LevelupLayer.h" 
#import "GameManager.h" 
@implementation LevelupLayer 
@synthesize optionsArray,spritesArray; 
@synthesize confirmLabel; 
@synthesize counter; 

+(id) scene { 
    CCScene *scene = [CCScene node]; 
    CCLayer* layer = [LevelupLayer node]; 
    [scene addChild:layer]; 

    return scene; 
} 

-(void)onEnter 
{ 

counter = 1; // for debugging 
//Detemine what levelups are possible 
GameManager* gm = [GameManager sharedManager]; //GameManager is a helper that oversees communication between layers and plists 
optionsArray = [gm possibleLevelups]; //Access plist and formats data into expected format 
[optionsArray retain]; 
int numPossibilities = [optionsArray count]; 

//Build Levelup layer based on possible options 
CGSize size = [[CCDirector sharedDirector] winSize]; 
//float positionIncrement = (size.width/numPossibilities) - ((size.width/numPossibilities) * 0.5); 
float positionIncrement = (size.width/numPossibilities); 
float stripWidth = size.width/numPossibilities; 

for (int i = 0; i < numPossibilities; i++) { 
    int slot = i+1; 
    NSDictionary* optionDict = [optionsArray objectAtIndex:i]; 
    NSString* name = [optionDict objectForKey:@"name"]; 
    NSString* title = [optionDict objectForKey:@"title"]; 
    NSString* description = [optionDict objectForKey:@"description"]; 


    // Add the sprite 
    CCSprite* optionSpite = [CCSprite spriteWithSpriteFrameName:[NSString stringWithFormat:@"%@.png",name]]; 
    [self addChild:optionSpite]; 
    [spritesArray addObject: optionSpite]; 
    optionSpite.position = CGPointMake(slot * positionIncrement, size.height*0.60); 
    [optionSpite setAnchorPoint:CGPointMake(0.5f, 0.5f)]; 

    // Add the description 
    CCLabelBMFont *optionDescription = [CCLabelBMFont labelWithString:description fntFile:@"bodyFont.fnt" width:stripWidth alignment:kCCTextAlignmentCenter]; 
    [self addChild:optionDescription]; 
    optionDescription.position = CGPointMake(slot * positionIncrement, size.height*0.30); 
    [optionDescription setAnchorPoint:CGPointMake(0.5f, 0.5f)]; 

    // Add the title 
    CCLabelBMFont *optionTitle = [CCLabelBMFont labelWithString:title fntFile:@"titleFont.fnt" width:stripWidth alignment:kCCTextAlignmentCenter]; 
    [self addChild:optionTitle]; 
    optionTitle.position = CGPointMake(slot * positionIncrement, size.height*0.90); 
    [optionTitle setAnchorPoint:CGPointMake(0.5f, 0.5f)]; 

} 
[self scheduleUpdate]; //Update only prints counter to see how many frames it lasts 
} 


-(BOOL) ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event 
{ 
    return YES; 
} 

-(void) update:(ccTime)delta 
{ 
    CCLOG(@"counter: %d",counter); 
    counter++; 
} 

-(void) onExit 
{ 
    [optionsArray release]; 
} 


@end 

`

回答

0

我想通了,它没有任何与我发布的代码,对此很抱歉。这只是对非保留数组的愚蠢的释放调用。以前保留阵列,它工作正常。对不起,关于哭狼

1

NSDictionaries我没有看到任何[super onEnter];[super init]或类似的东西...这是你的问题

先上添加[super onEnter]第一行在onEnter

其次添加一个init方法是这样的:

-(id)init{ 
if (self=[super init]){} 
} 

三在你onExit方法的末尾添加[super onExit]

+0

噢,我的天啊......我简直不敢相信我忘了那个。让我旋转一下,但看起来像我的问题。谢谢你的新眼睛 – Pinwheeler

+0

不幸的是,即使改变了这个问题仍然存在。任何其他想法? – Pinwheeler

+0

唯一的另一个想法是在init方法中移动整个代码。也许在转换时没有时间做所有这些,因此init是一个更安全的解决方案。还可以使僵尸对象查看它崩溃的位置,以及它是否与您提到的数组有关。 – skytz