【问题标题】:cocos2d layer not responding to touches after a menu layer is popped弹出菜单层后cocos2d层不响应触摸
【发布时间】:2011-01-03 16:37:33
【问题描述】:

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

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

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

处理此问题的最佳方法是什么?我想我可以在每次调用Update 时将游戏层注册为目标委托,但这似乎有点荒谬。有没有办法在关闭之前在暂停菜单中重新分配代表?有没有一种公认的方式来做到这一点?

【问题讨论】:

    标签: iphone cocos2d-iphone


    【解决方案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;
    }
    

    【讨论】:

      【解决方案2】:

      如果你释放你的暂停菜单对象,它不工作吗?或者,您可以在暂停图层未处于活动状态时将其移到屏幕之外。将它的 x,y 设置为 -1000 或其他值。

      【讨论】:

      • 不幸的是,这发生在暂停菜单场景被弹出之后。这会释放对象。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多