弹出菜单图层后,cocos2d图层不响应触摸

时间:2011-01-03 16:37:34

标签: iphone cocos2d-iphone

我正在使用cocos2d为iOS制作游戏。当调用主游戏性层构造函数时,它会注册以接收具有以下调用的触摸:

[[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self
                                                     priority:0 
                                              swallowsTouches:YES];

工作正常。当用户暂停游戏时,我将暂停菜单层推到CCDirector上。暂停菜单层以与上述相同的方式注册以接收触摸。该菜单中的第一个选项是恢复游戏(即弹出菜单层并返回正在进行的游戏)。但是,当发生这种情况时,游戏玩法层不再响应触摸。

处理此问题的最佳方法是什么?我想我可以在每次调用Update时将游戏性层注册为目标代理,但这看起来有点荒谬。有没有办法在关闭之前在暂停菜单中重新分配代理?这是否有可接受的方式?

2 个答案:

答案 0 :(得分:1)

事实证明,从弹出的场景返回时,CCMenu从基础CCLayer对象中窃取焦点存在一个已知问题。正如我在cocos2d论坛上发现的那样,可以接受的方法是,而不是创建一个新场景,覆盖透明层(以调暗现有场景),其中包含CCMenu。完成此CCMenu后,只需将其从场景中删除即可。

这是我的具体实施:

-(void)pauseMenuButtonPressed
{    
    if(!paused)
    {
        paused = TRUE;

        [[CCDirector sharedDirector] pause];

        CGSize s = [[CCDirector sharedDirector] winSize];
        pauseLayer = [CCColorLayer layerWithColor: ccc4(150, 150, 150, 125) width: s.width height: s.height];
        pauseLayer.position = CGPointZero;
        [self addChild: pauseLayer z:8];

        CCMenuItem *pauseMenuItemResume =[CCMenuItemImage itemFromNormalImage:@"menuItemResumeSmall.png"
                                                                selectedImage: @"menuItemResumeSmallSelected.png"
                                                                       target:self
                                                                     selector:@selector(pauseMenuResumeSelected)];


        CCMenuItem *pauseMenuItemMainMenu =[CCMenuItemImage itemFromNormalImage:@"menuItemMainMenuSmall.png"
                                                                selectedImage: @"menuItemMainMenuSmallSelected.png"
                                                                       target:self
                                                                     selector:@selector(pauseMenuExitToMainMenuSelected)];

        // Create the pause menu and add the menu items to it
        pauseMenu = [CCMenu menuWithItems:pauseMenuItemResume, pauseMenuItemMainMenu, nil];

        // Arrange the menu items vertically
        [pauseMenu alignItemsVertically];

        // add the menu to the scene
        [self addChild:pauseMenu z:10];

        [hudButtons setIsTouchEnabled:NO];
    }

}

-(void)pauseMenuResumeSelected
{
    [self removeChild:pauseMenu cleanup:YES];
    [self removeChild:pauseLayer cleanup:YES];
    [hudButtons setIsTouchEnabled:YES];
    [[CCDirector sharedDirector] resume];
    paused = FALSE;
}

答案 1 :(得分:0)

如果您释放暂停菜单对象,它是否有效?或者,您可以在屏幕未激活时将暂停层移动到屏幕外部。将它的x,y设置为-1000或其他东西。