(Cocos2D) Détecte le CCScene montre?
-
12-11-2019 - |
Question
Est-il possible de détecter CCScene est actuellement à l'affiche sur la scène?J'ai 2 CCScenes dans mon jeu et je veux une certaine action de se produire si l'on est à l'affiche.
Aussi rapide liés à la question, si je voulais vérifier si une CCMenu est pas montrant actuellement je ferais quelque chose comme
if (!menu) {
//Menu is not showing currently
}
Je suis un peu un noob quand il s'agit de Cocos2D, de sorte s'il vous plaît pardonnez-moi :)
Merci!
La solution
Vous pouvez utiliser le CCDirector de dire que la scène est en cours d'exécution.
[[CCDirector sharedDirector] runningScene];
Quant à savoir si le menu est affiché.Vous devez vérifier avec le parent du menu.Si le parent où votre CCLayer, alors vous pouvez le vérifier par
// assume menu is set up to have tag kMenuTag
CCMenu * menu = [self getChildByTag:kMenuTag];
Si le menu est l'enfant d'un autre noeud, vous pouvez obtenir le parent par le biais d'une méthode similaire, et obtenir une référence vers le menu.
Si l' menu == nil
, il est pas à l'affiche.
Mise à JOUR
Dans cocos2d, vous êtes découragés de conservation des références à l'ensemble de vos sprites, au lieu de cela, vous devriez être en donnant à chaque nœud une étiquette unique et l'utiliser pour y faire référence.Pour atteindre votre objectif premier, vous pouvez donner à votre scène une balise dans votre 2 respectifs CCLayer classes.
Vous pouvez configurer vos étiquettes uniques dans un enum dans un fichier appelé Balises.h, puis de l'importer dans toutes les classes qui ont besoin d'accéder à vos tags
Exemple De Balises.h
enum {
kScene1Tag = 0,
kScene2Tag = 1,
kMenuTag = 2};
Ensuite, dans votre couche de la classe
+(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;
}
Maintenant, quand vous prenez la scène actuelle, vous pouvez vérifier contre les tags
int currentSceneTag = [[CCDirector sharedDirector] runningScene].tag;
if (currentSceneTag == kScene1Tag) {
} else if (currentSceneTag == kScene2Tag) {
}
L' tag
la propriété est à partir de CCNode
qui est la classe de base CCLayer
, CCScene
, CCSprite
, CCMenu
...
Autres conseils
Ceci comment savoir quelle scène fonctionne
if ([CCDirector sharedDirector].runningScene == yourScene1) {
// your scene 1 is showing
} else {
// your scene 2 is showing
}
et pour savoir si un nœud est enfant de la scène de course
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
}