Спрайт не виден время от времени - PullRequest
1 голос
/ 08 декабря 2011

У меня есть приложение для iphone, основанное на cocos2d, с проблемой.Когда пользователь приостанавливает игру, а затем нажимает кнопку возобновления, некоторые 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;
}
  }

== РЕДАКТИРОВАТЬ ===

У меня естьобнаружил, что эта проблема также относится к спрайтам, которые я добавляю прямо в мою сцену, например клоуну спрайтов, добавленному, как показано ниже:

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

== END OF EDIT ===

1 Ответ

0 голосов
/ 10 декабря 2011

Есть что-то странное в вашей настройке.FallingObject - это CCNode, который содержит два спрайта.Но вместо того, чтобы добавить спрайты в класс FallingObject (self), а затем добавить FallingObject на сцену, вы добавляете спрайты непосредственно на сцену.Это оставляет узел FallingObject вне иерархии сцены.

Вот почему вы должны выполнять такие вещи, как обновление позиций спрайтов вручную, что в противном случае вообще не требовало бы кода:стоит предположить, что из-за несоответствия этой настройки вы можете случайно перемещать спрайты за пределы экрана, либо узел либо неправильно остановлен, либо возобновлен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...