即使我暂停游戏,有没有菜单工作?

时间:2011-06-25 06:05:59

标签: iphone cocos2d-iphone

所以我正在制作菜单:

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

它工作正常,但我也希望在发生这种情况时暂停游戏,所以我这样做:

[[CCDirector sharedDirector] pause];

所以,这也有效,但问题是当我暂停游戏时,它也会暂停菜单。反正有没有发生这种情况?在我看来它的计数器直观地暂停了菜单......但是反正:有没有办法让它不能暂停菜单?或者我是否必须使用其他方法...如果我必须但我想知道是否有任何相对快速的修复此代码将使其工作...

2 个答案:

答案 0 :(得分:2)

嗯......我从不使用[[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];

然后你需要有一个标记,你的游戏可以检查它是否应该做任何动作。

例如,如果您的AI在方法更新中执行了某些操作:(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());
        }        
    }
}

希望这有帮助。

答案 1 :(得分:0)

如果我开发你的应用程序,我会这样做

而不是暂停游戏我会用你的菜单创建自定义场景。

而不是暂停游戏,我会用这个新场景取代之前的场景,我们已经添加了前一个场景中的菜单。

所以即使我们暂停游戏也可以访问。(暂停意味着用你的菜单淡化新场景)