【问题标题】:how to properly handle touch events for multiple layers?如何正确处理多层的触摸事件?
【发布时间】:2012-10-30 07:58:00
【问题描述】:

我目前有一个“控制台”CClayer,它正在处理已添加到其中的精灵的触摸检测。但是,我也有一些我想要进行触摸检测的精灵,它们不是控制台层的一部分......它们目前是从 CCNode 继承的类的子级。

我的理解是,将“isTouchEnabled”属性设置为true的cocos对象越多,性能受到的影响就越大,所以我很好奇我应该如何处理这个问题?

我应该:

A) 控制台的 touchesBegan 方法是否对属于 CCNode 的精灵进行检测?

B) 只需在 CCNode 对象上实现 isTouchEnabled

C) 其他方法?

【问题讨论】:

    标签: cocos2d-iphone


    【解决方案1】:

    好吧,对于初学者来说,您应该只在担心时才关注性能,即您正在看到或测量(在设备上而不是模拟器上)一些不适当的响应时间。

    我会避免检测涉及另一个节点的触摸 - 它可能会变得混乱,软件方面。当触摸位于检测节点关注的对象的位置时,我倾向于严格返回 YES(来自 ccTouchBegan)。当您返回 NO 时,调度程序会将触摸传递给其他处理程序(“在控制台下”),直到一个这样的 CCNode 接手。如下:

    - (void) onEnter{
        [[[CCDirector sharedDirector] touchDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:YES];
        [super onEnter];
    }
    
    - (void) onExit{
        [[[CCDirector sharedDirector] touchDispatcher] removeDelegate:self];
    [super onExit];
    }
    
    - (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event{
        if (!_visible || !_enabled) {
            return NO;
        }
        CGPoint loc = [touch locationInView:touch.view];
        loc = [[CCDirector sharedDirector] convertToGL:loc];
    
        if ([self containsPoint:loc]) {
            // do your thing here !
            return YES;
        }
    
        return NO;
    }
    
    -(BOOL) containsPoint:(CGPoint) location {
        // determine here whether this node should be handling
        // this touch.
    }
    

    【讨论】:

    • 所以你不在父对象上使用 touchBegan 并检查子精灵中的触摸?您实际上对各个精灵本身进行了 touchBegan 操作吗?
    • 实际上我使用了一个触摸处理协议,在游戏中这样做是有意义的。以上来自一个自制的滚动菜单。在基于瓷砖的 RPG 中,对于游戏玩法,我有 2 个触摸处理程序:一个用于 WorldView 处理程序:它知道所有士兵在哪里,瓷砖在哪里,以及地图上的“触摸敏感”对象是什么。另一个是用于我的 HumanController 对象,基本上是用于选择技能和动作等的 GUI……我通常不继承 CCSprite :相反,我有一个带有 mapLayout 处理程序的 Soldier 类。它决定如何代表士兵并使用 WorldView 的服务。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-29
    • 2015-12-05
    • 1970-01-01
    • 1970-01-01
    • 2012-01-12
    相关资源
    最近更新 更多