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

Posted

技术标签:

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

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

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

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

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

【问题讨论】:

【参考方案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 或其他值。

【讨论】:

不幸的是,这发生在暂停菜单场景被弹出之后。这会释放对象。

以上是关于弹出菜单层后cocos2d层不响应触摸的主要内容,如果未能解决你的问题,请参考以下文章

MFC对话框中如何响应弹出式菜单事件 点击按钮 弹出菜单 菜单消息事件响应不了

弹出遮罩层后禁止滚动效果

如何在swiftui中的navigationitems下面创建一个弹出菜单

Youtube 模态弹出关闭问题

自定义QT QWidget对象响应弹出菜单的解决方法

自定义QT QWidget对象响应弹出菜单的解决方法