2011-12-08 11 views
1

私は問題のあるcocos2dベースのiphoneアプリを持っています。ユーザーがゲームを一時停止し、再開ボタンを押すと、一部のCCスプライトが画面から消えます。 この動作はランダムで、パターンは続きません。私はこれが、ユーザーがゲームを再開したときにのみ起こることを知っています。スプライトが時刻に表示されない

ここにコードがありますが、何が間違っていますか? 私は最初にメモリ管理の問題かもしれないと思っていましたが、ユーザーがレジュームしたときに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 ===

私はこの問題はまた、スプライトのために真であることを発見したそのI以下に示すような追加スプライトピエロとして、私のシーンに直接追加します。

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 

編集=== OF == END

+0

Cocos2Dには仮想時間の経過を停止するために呼び出すことができるpause()メソッドがあります。あなたはすでにそれを呼んでいますか?乾杯。 –

答えて

0

あなたの設定が奇妙なことがあります。 FallingObjectは2つのスプライトを含むCCNodeです。しかし、FallingObjectクラス(自己)にスプライトを追加し、FallingObjectをシーンに追加する代わりに、スプライトを直接シーンに追加します。これにより、FallingObjectノードがシーン階層外に残されます。何が価値があるため

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

、私はそれによるこの設定の不適合に、あなたかもしれないと仮定します。あなたはそれ以外の場合はまったくコードを必要としないだろう手動でスプライト位置を更新するようなことをしなければならない理由でもあります

誤ってスプライトを画面の外に移動するか、ノードが適切に一時停止または再開されていない。

関連する問題