Ну ... я никогда не использую [[CCDirector sharedDirector] паузу]. Он останавливает все Cocos2D, и это не то, что вы хотите здесь. Что мне неясно, так это то, что вам нужно меню, которое занимает весь экран, или если вам нужно меню в верхней части игры, но вы все равно можете увидеть игру.
Добавление полноэкранного меню:
Создайте новый подкласс CCLayer и назовите его как хотите. Настройте, как вам нравится, а затем используйте:
// Push the PauseLayer screen (or whatever you have called your menu
// layer class)
// This will pause your game and hold it's state in memory.
[[CCDirector sharedDirector] pushScene:[PauseLayer node]];
// Pop the cached scene
// This will remove your menu layer and display your
// game layer where it was left off.
// Any custom timers will likely need to be
// reset/resumed inside of onEnter or onEnterTransitionDidFinish
[[CCDirector sharedDirector] popScene];
Добавление меню типа наложения:
Чтобы получить меню, в котором вы все еще можете видеть игру, вам нужно сделать что-то вроде этого.
CCLabelBMFont *difficultyLabel = [CCLabelBMFont labelWithString:@"Difficulty" fntFile:@"projectOneMenuItem1.fnt"];
CCMenuItemLabel *difficulty = [CCMenuItemLabel itemWithLabel:difficultyLabel target:self selector:@selector(chooseDifficulty:)];
CCLabelBMFont *audioSourceLabel = [CCLabelBMFont labelWithString:@"Switch to iPod Audio" fntFile:@"projectOneMenuItem1.fnt"];
CCMenuItemLabel *audioSource = [CCMenuItemLabel itemWithLabel:audioSourceLabel target:self selector:@selector(switchAudioSource:)];
CCLabelBMFont *leaderboardsLabel = [CCLabelBMFont labelWithString:@"Leaderboards" fntFile:@"projectOneMenuItem1.fnt"];
CCMenuItemLabel *leaderboards = [CCMenuItemLabel itemWithLabel:leaderboardsLabel target:self selector:@selector(showLeaderboards:)];
CCLabelBMFont *achievementsLabel = [CCLabelBMFont labelWithString:@"Achievements" fntFile:@"projectOneMenuItem1.fnt"];
CCMenuItemLabel *achievements = [CCMenuItemLabel itemWithLabel:achievementsLabel target:self selector:@selector(showAchievements:)];
CCLabelBMFont *backLabel = [CCLabelBMFont labelWithString:@"Back" fntFile:@"projectOneMenuItem1.fnt"];
CCMenuItemLabel *back = [CCMenuItemLabel itemWithLabel:backLabel target:self selector:@selector(goBack:)];
CCMenu *menu = [CCMenu menuWithItems: difficulty, audioSource, leaderboards, achievements, back, nil];
menu.position = ccp(winSize.width/2, winSize.height*0.15);
[menu alignItemsVerticallyWithPadding:10];
[self addChild:menu];
Затем вам понадобится флаг, который ваша игра может проверить, чтобы решить, следует ли ему выполнять какие-либо действия.
Например, если ваш ИИ делал что-то в обновлении метода: (ccTime) dt, то вы бы сделали это:
// Check to see if game actions should be running or not
if(!isGamePaused)
{
// AI Code here
}
Вы делаете этот флаг доступным для всего, кто в нем нуждается, и проверяете наличие флага паузы. В приведенном выше коде isGamePaused представляет собой переменную bool, доступную для всего класса.
Если вам нужно приостановить симуляцию физики, такую как Box2D, это также работает для этого.
if(!isGamePaused)
{
_world->Step(dt, 10, 10);
for(b2Body *b = _world->GetBodyList(); b; b=b->GetNext())
{
if (b->GetUserData() != NULL)
{
if(!b->IsActive()) continue;
CCSprite *sprite = (CCSprite *)b->GetUserData();
sprite.position = ccp(b->GetPosition().x * PTM_RATIO, b->GetPosition().y * PTM_RATIO);
sprite.rotation = -1 * CC_RADIANS_TO_DEGREES(b->GetAngle());
}
}
}
Надеюсь, это поможет.