在cocos2d中停止触摸传播



我们正在cocos2d中制作一款游戏,其中可能会出现一个琐事问题。小问题被实现为一个新的,透明的CCLayer在游戏板上,其中包含一个CCMenu与所有的问题。

我们的问题是我们似乎不能让触摸停止正确的传播。当琐事菜单出现时,玩家不应该点击棋盘层上的"掷骰子"按钮。

我们已经尝试在添加琐事层之前通过调用dice.isTouchEnabled=NO;来实现这一点,但我们不知道如何重新启用骰子按钮。

我们还尝试将ccTouchBegan从NO更改为YES,以始终消耗所有触摸,但随后它停止响应我们的菜单。这似乎应该是正确的做法,但为什么菜单停止响应?

我们的教授建议实现一个回调函数,我们当然可以这样做,但看起来应该比这更容易。

有人有什么建议吗?

我知道有两种方法可以做到这一点。

方法1(我正在使用的方法)

  1. 在琐事问题弹出之前,使用下面的功能禁用底层场景节点上的菜单。这个方法是一个递归方法,所以它也会禁用节点子节点上的所有菜单。

  2. 当琐碎问题被驳回时,发送一个NSNotification,该通知将被底层场景节点接收,并将重新启用节点及其子节点上的菜单。你可以使用NSNotification的block方法来缩短你的代码

Docs on addObserverForName:object:queue:usingBlock:

(void) MenuStatus:(BOOL)_enable Node:(id)_node {
    for (id result in ((CCNode *)_node).children) {
        if ([result isKindOfClass:[CCMenu class]]) {
            for (id result1 in ((CCMenu *)result).children) {
                if ([result1 isKindOfClass:[CCMenuItem class]]) {
                    ((CCMenuItem *)result1).isEnabled = _enable;
                }
            }
        }
        else
            [self MenuStatus:_enable Node:result];
    }
}

方法2

创建一个不可见的图层,它将吞下Trivia Question图层下面的所有触摸。下面是一个你可以尝试的类:https://gist.github.com/christophercotton/1563708

最新更新