Есть ли вообще меню, даже если я ставлю игру на паузу? - PullRequest
2 голосов
/ 25 июня 2011

Итак, я делаю меню:

CCMenu *menu = [CCMenu menuWithItems:addThing1, addThing2, addThing3, nil];
[menu alignItemsVertically];
[self addChild:menu];

Работает нормально, но я также хочу приостановить игру, когда это произойдет, поэтому я делаю это:

[[CCDirector sharedDirector] pause];

Итак, это тоже работает, но проблема в том, что когда я ставлю игру на паузу, она тоже останавливает меню. Есть ли способ, чтобы этого не произошло? Мне кажется, что его счетчик интуитивно понятен и для паузы в меню ... Но в любом случае: есть ли способ заставить его не останавливать меню? Или я должен прибегнуть к другим методам ... Я сделаю это, если захочу, но хочу знать, есть ли относительно быстрое исправление этого кода, которое заставит его работать ...

Ответы [ 2 ]

2 голосов
/ 25 июня 2011

Ну ... я никогда не использую [[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());
        }        
    }
}

Надеюсь, это поможет.

0 голосов
/ 25 июня 2011

если я разрабатываю ваше приложение, я буду делать это так

вместо того, чтобы ставить игру на паузу, я создам пользовательскую сцену с помощью вашего меню.

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

, чтобы она была доступна даже после приостановки игры (пауза означает исчезновение новой сцены с вашим меню)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...