2011-07-29 3 views
0

Cocos2d iPhone을 사용하여 몇 가지 게임을 작성했습니다. 이전 게임 모두에서 내가 설정할 때 장면을 바꿀 것입니다 CCMenu 그리고 끝나면 그 장면을 그대로 두십시오. 현재 진행중인 프로젝트에서는 현재 장면에 메뉴가 있어야하며 메뉴를 여러 번 열었다가 닫을 수 있어야합니다. 웬일인지, 나는 이해할 수 없다. removeChild는 메뉴를 제거하지 않을 것이다. removeChild를 사용하여 표시하는 몇 가지 온라인 예제를 보았지만 나에게는 적합하지 않습니다. 아래는 내 메뉴 코드입니다. Start/CreateNewAccount 버튼을 누르면 현재 메뉴가 장면에서 완전히 제거됩니다.Cocos2d iPhone 게임 장면에서 메뉴 제거

이것은 내 init 메소드에 있습니다.

 CCMenuItemImage *Start = [CCMenuItemImage itemFromNormalImage:@"MakeLemonade.png" selectedImage:@"MakeLemonadePressed.png" 
                  target:self 
                 selector:@selector(CreateNewAccount:)]; 
    CCMenuItemImage *About = [CCMenuItemImage itemFromNormalImage:@"About.png" selectedImage:@"AboutPressed.png" 
                  target:self 
                  selector:@selector(About:)]; 
    Start.position = ccp(-175, -90); 
    About.position = ccp(175, -90); 

    CCMenu *MainMenu = [CCMenu menuWithItems: Start, About, nil]; 
    [Start runAction:[CCFadeIn actionWithDuration:1.0]]; 
    [About runAction:[CCFadeIn actionWithDuration:1.0]]; 
    [self addChild:MainMenu z:6]; 

} 
return self; 
} 
-(void) BeginMenuLayer { 

//this is not working 


[self removeChild:MainMenu cleanup:YES]; 

} 

답변

1

init 메소드에서 MainMenu를 로컬 변수로 선언했습니다. 속성으로 설정하지 않으므로 나중에 제거 할 때 참조가 없습니다.

1) 속성이 이런 식으로 선언했는지 확인하십시오 :

@property (nonatomic, retain) CCMenu *MainMenu; 

2) 구현의 상단을 합성하여 :

@synthesize MainMenu; 

3) 확인 당신은 그것을 해제 귀하의 dealloc에서 :

-(void)dealloc { 
    self.MainMenu = nil; 
    [super dealloc]; 
} 

4) 구성 할 때 로컬 varia가 아닌 속성에 할당하십시오 BLE :

self.MainMenu = [CCMenu menuWithItems: Start, About, nil]; 

지금 당신은 당신이 removeChild:cleanup: 나중에 전달할 수있는 객체에 대한 유지 참조가 있습니다.

+0

속성으로 설정하지 않아도됩니다. iVar로 충분합니다. 그냥 내가 분명히 할 거라고 생각 했어. – EmilioPelaez

+0

사실입니다. ivar 할당을 수행 할 때 메모리가 누출되지 않도록 여분의 노력이 필요합니다. – cduhn

+0

오, 그게 다야, 네 도움에 감사드립니다 !!! – user597136