2012-01-23 1 views
1

Можно ли определить, какая CCScene в настоящее время отображается на сцене? У меня есть 2 CCScenes в моей игре, и я хочу, чтобы какое-то действие произошло, если вы показываете.(Cocos2D) Обнаруживает CCScene?

также быстро связанный с этим вопрос, если я хотел бы проверить, если CCMenu является не показывая в настоящее время я сделал бы что-то вроде

if (!menu) { 
    //Menu is not showing currently 
    } 

Я немного нуб, когда дело доходит до Cocos2D так простите меня :)

Спасибо!

ответ

3

Вы можете использовать CCDirector сказать, какая сцена Бег.

[[CCDirector sharedDirector] runningScene]; 

Что касается отображения меню. Вам нужно будет проверить с родителем меню. Если родитель, где ваш CCLayer, то вы можете проверить с помощью

// assume menu is set up to have tag kMenuTag 
CCMenu * menu = [self getChildByTag:kMenuTag]; 

Если меню ребенка какого-то другого узла, вы можете получить родительский через подобный метод и получить ссылку на меню.

Если menu == nil, он не отображается.

UPDATE

В cocos2d, вы не рекомендуется держать ссылки на все ваши спрайтов, вместо этого вы должны дать каждому узлу уникальный тег и использовать, чтобы ссылаться на него. Чтобы достичь своей первой цели, вы можете присвоить вашей сцене свой тег в двух соответствующих классах CCLayer.

Вы можете настроить свои уникальные теги в перечислении в файле с именем tags.h, а затем импортировать, что в каких-либо классов, которым необходим доступ к тегам

Пример tags.h

enum { 
    kScene1Tag = 0, 
    kScene2Tag = 1, 
    kMenuTag = 2}; 

Тогда в классе слоя

+(id) scene 
{ 
    // 'scene' is an autorelease object. 
    CCScene *scene = [CCScene node]; 
    scene.tag = kScene1Tag; 
    // 'layer' is an autorelease object. 
    HelloWorld *layer = [HelloWorld node]; 

    // add layer as a child to scene 
    [scene addChild: layer]; 

    // return the scene 
    return scene; 
} 

Теперь, когда вы захватить текущую сцену можно проверить с тегами

int currentSceneTag = [[CCDirector sharedDirector] runningScene].tag; 
if (currentSceneTag == kScene1Tag) { 

} else if (currentSceneTag == kScene2Tag) { 

} 

Свойство tag от CCNode, который является базовым классом CCLayer, CCScene, CCSprite, CCMenu ...

+0

Есть ли способ, которым я могу NSLog текущего runningScene моего CCDirector, всякий раз, когда я пытаюсь сделать оператор if, обнаруживающий, что один CCScene открыт, он всегда НЕТ, даже если он должен быть ДА. –

+1

@iBradApps Надеюсь, мое редактирование помогает. –

+0

Да, да. Будет ли другой способ иметь BOOL в синглтоне и просто установить его в YES или NO в зависимости от сцены? –

1

Это как узнать, какая сцена работает

if ([CCDirector sharedDirector].runningScene == yourScene1) { 
    // your scene 1 is showing 
} else { 
    // your scene 2 is showing 
} 

и выяснить, если узел является потомком бегущего сцены

BOOL isShowing = NO; 
CCNode *node = yourMenu; 
while (node != nil) { 
    if (node == [CCDirector sharedDirector].runningScene) { 
     isShowing = YES; 
     break; 
    } else { 
     node = node.parent; 
    } 
} 
if (isShowing) { 
    // your menu is in the display hierarchy 
} 
+0

Ok первая часть хороша, но что же делать isShowing во второй части, и почему я установить узел в node.parent в части else? –

 Смежные вопросы

  • Нет связанных вопросов^_^