微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

事件处理 – 如何在cocos2d中的模态层下停止所有CCTouch?

在我的cocos2d游戏中,我有一个“设置”按钮,它启动一个模态层,用于锁定其下的所有内容.为此,我使用菜单状态方法的组合锁定所有CcmenuItems并使用覆盖层;两者都在代码中.

问题是这两种解决方案似乎都不适用于CCScrollLayers.当我单击按钮(启动模态)时,仍然可以滚动CCScrollLayer,这不是我想要的.

我想:

>按下禁用按钮ALL触摸并禁用包括CCScrollLayers在内的所有元素
>启动模态(仅允许触摸模态)

我试过了:

>使用Touch使用CCTargetedTouchDelegate吞下所有触摸

[[CCTouchdispatcher shareddispatcher] addTargetedDelegate:self priority:0 swallowstouches:YES];

>我试过了

self.isTouchEnabled =启动模态的图层上的NO

>我已经尝试调整MenuStatus方法,以便它适用于CCScrollLayers但它似乎不起作用.

我不确定我做错了什么.我的代码如下.

// My main layer which launches the Settings Modal Layer

#pragma mark - Lock/Unlock layers

-(void) doSettings
{    
    [self lockLayers];
    SettingsModalLayer *sml = [[[SettingsModalLayer alloc] init] autorelease];
    [sml showSettingsOnLayer:self closeBlock:^{[self unlockLayers];}];
}

-(void) lockLayers
{
    [[CCTouchdispatcher shareddispatcher] addTargetedDelegate:self priority:0 swallowstouches:YES];
    [self MenuStatus:NO Node:self];   
}

-(void) unlockLayers
{
    [self MenuStatus:YES Node:self];
}


// disabled/Enable layers
-(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;
                }
            } // next
        } 

    } // next

}


-(void) registerWithTouchdispatcher {
    [[CCTouchdispatcher shareddispatcher] addTargetedDelegate:self priority:INT_MIN+1 swallowstouches:YES];
}

- (void)cctouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"Event: %@",event);
    for( UITouch *touch in touches )
    {
        CGPoint location = [touch locationInView: [touch view]];

        location = [[CCDirector sharedDirector] convertToGL: location];        
        cclayer *gl = (cclayer *)[self getChildByTag:4];
        [gl setIsTouchEnabled:NO];

    }
}
-(void) ccTouchCancelled:(UITouch *)touch withEvent:(UIEvent *)event
{

}


-(void) ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event
{
    [self removeFromParentAndCleanup:YES];    
}

-(BOOL) ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
{

    return YES;
}



// Settings Modal Layer

-(void) showSettingsOnLayer:(cclayer *)layer closeBlock:(void (^)())noBlock 
{
    CoverLayer *coverLayer = [[CoverLayer alloc] init];
    [layer addChild:coverLayer z:1000];
    [coverLayer runAction:[CCFadeto actionWithDuration:kAnimationTime opacity:155]]; // smooth fade-in to dim with semi-transparency

... // Other stuff goes here

}


    // CoverLayer
    // This is meant to stop all touches,but it doesn't really work on CCScrollLayer

#define kDialogTag 1234
#import "CoverLayer.h"



// class that implements a black colored layer that will cover the whole screen 
// and eats all touches except within the dialog Box child

@implementation CoverLayer
- (id)init {
    self = [super init];
    if (self) {
        [self initWithColor:ccc4(0,0) 
                      width:[CCDirector sharedDirector].winSize.width 
                     height:[CCDirector sharedDirector].winSize.height];
        self.isTouchEnabled = YES;
    }
    return self;
}

- (void)dealloc {
    [[CCTouchdispatcher shareddispatcher] removeDelegate:self];
    [super dealloc];
}


- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event 
{
    CGPoint touchLocation = [self convertTouchToNodeSpace: touch];
    CCNode *dialogBox = [self getChildByTag: kDialogTag];

    // eat all touches outside of dialog Box
    return !CGRectContainsPoint(dialogBox.boundingBox,touchLocation);
}

解决方法

您只需要了解优先级如何与CCTouchdispatcher一起使用.
具有最小优先级值的层将首先接收触摸事件.现在您只需要相应地调整优先级.

在使用CCTouchdispatcher注册并覆盖ccTouchBegan时,创建一个阻塞层类并将其优先级设置为最小值,并在其中返回YES.

如果您查看Ccmenu类,您会注意到认优先级是kCcmenuTouchPriority = -128,这就是菜单项具有更高触摸优先级的原因.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐