精灵有时不可见

时间:2011-12-08 08:45:26

标签: xcode cocos2d-iphone

我有一个基于cocos2d的iphone应用程序有问题。当用户暂停游戏然后点击恢复按钮时,一些CCSprites将从屏幕上消失。 此行为是随机的,没有遵循模式。我只知道这只会在用户恢复游戏时发生。

这是代码,我做错了什么? 我首先想到它可能是一个内存管理问题,但是当用户点击恢复时我从未得到任何EXC_BAD_ACCESS ...所以精灵可能仍然存在。

精灵是我称之为“myobject”的对象中的一个属性。

在myObject.h中我有:

@interface myObject : CCNode{
   CCSprite *_sprite1,*_sprite2;
   // some other code
}
@property (nonatomic,retain) CCSprite *sprite1,*sprite2;

在myObject.m文件中:

@synthesize sprite1=_sprite1;
@synthesize sprite2=_sprite2;

 +(id)create:(CCLayer*)scene{
    myobject.sprite1 = [CCSprite spriteWithFile:spriteFile];
    [scene addChild:myobject.sprite1];
    // same for sprite2
 }

-(void) move:(ccTime)dt{
    //SOMECODE
    self.sprite1.position=ccp(self.x,self.y); // same for sprite2
 }

然后他们会在myobject上调用一个函数。

在主场景中,以下是这些对象的创建和移动方式:

myObject *myObject;
NSMutableArray *_myObjects;

@implementation HelloWorld 

+(id) scene
{
    CCScene *scene = [CCScene node];
    HelloWorld *layer = [HelloWorld node];
    [scene addChild:layer z:0 tag:33];
    return scene;
}

-(id) init
{
    if( (self=[super init] )) {
    _myObjects = [[NSMutableArray alloc] init];
            // some other code
    }
}

-(void) addObject(){
      myObject=[myObject create:self];
      [_fallingObjects addObject:fallingObject];
}

-(void) nextFrame:(ccTime) dt{
for(myObject *theObject in _myObjects){
            [theObject move:dt];
    }
}


// And here is the function that does the pause/unpause, here it is:


- (void) pauseGame{
if(pauseStatus==0){
        [[CCDirector sharedDirector] pause];
        pauseStatus=1;
        // some code to display menu etc... such as:
    [self addChild:pauseMenu z:10];
}
else{
    [self removeChild:pauseMenu cleanup:YES];
        [self removeChild:scoreLabel cleanup:YES];
        [self removeChild:highscoreLabel cleanup:YES];
        [self removeChild:titleLabel cleanup:YES];
        [self removeChild:pauseLayer cleanup:YES];
        [[CCDirector sharedDirector] resume];
        pauseStatus=0;
}
  }

== EDIT ===

我发现这个问题对于我直接添加到场景中的精灵来说也是如此,例如添加的精灵小丑如下所示:

CCSprite *clown;
@implementation HelloWorld
-(id) init
{
if( (self=[super init] )) {
       // some code
       clown = [[CCSprite spriteWithFile:@"clown.png"] retain];
       [self addChild:clown z:2];
       // some more code
    }
}
@end

==编辑结束===

1 个答案:

答案 0 :(得分:0)

您的设置有些奇怪。 FallingObject是一个包含两个精灵的CCNode。然而,不是将精灵添加到FallingObject类(self),然后将FallingObject添加到场景中,而是将精灵直接添加到场景中。这会将FallingObject节点保留在场景层次结构之外。

这也是为什么你必须手动更新精灵位置,否则根本不需要代码的原因:

self.sprite1.position=ccp(self.x,self.y);

对于它的价值,我认为由于此设置的不一致,您可能会意外地将精灵移动到屏幕外,或者节点未正确暂停或恢复。